前回、毎朝必要なメッセージの通知を試みた筆者、アイコンとメッセージは設定時刻に表示されて、メールボックスを先に開くと忘れがちになる"クリックするだけの"デイリータスクを無事に処理することができたのだが、ひとつの課題が生じた。
○NotifyIconで生じた課題

task.ShowBalloonTip(300000, "9時通知", "おい貴様、起きろ!朝9時だ。
朝の提出物チェックしろ!!!!!", 1)

で設定した300000ミリ秒が想像通りには機能しない。NotifyIconの仕様は通知であるためそこまで、長く表示することはできないようだ。テストしたときに表示時間がまったく頭に入っていなかったため、表示されて成功と判断していた。これでは、もし離席やPC以外の作業を行っていた場合に華麗にスルーしてしまう。気付いていないわけだから、リアルな災難に遭遇してしまう。

ループで処理すれば、いけるのではないか?と以下のようなコードを試してみたところ

Add-Type -AssemblyName System.Windows.Forms

for ($i = 0; $i -lt 60; $i++) {
$task = New-Object System.Windows.Forms.NotifyIcon
$task.Icon = [System.Drawing.SystemIcons]::Information
$task.Visible = $true

$task.ShowBalloonTip(5000, "9時通知", "通知 $($i+1)", 2)

Start-Sleep -Seconds 6
$task.Dispose()
}

やはり、NotifyIconではこちらの目的にぴったりと合わないようだ。
○MessageBoxを使ってみる

"通知"するのではなく、こちらのクリックで終了するようにしたいわけなので、ここはVisualBasicやExcel VBAなどでも触ったことのあるMessageBox(Microsoftの.NET Framework APIリファレンス)をシンプルに使ってみようと考えた。

Add-Type -AssemblyName System.Windows.Forms

[System.Windows.Forms.MessageBox]::Show(
"9時です。メールを開く前にすることありますよね?わかりますよね?メールを開くと忘れますよ?",
"強制通知",
[System.Windows.Forms.MessageBoxButtons]::OK,
[System.Windows.Forms.MessageBoxIcon]::Error

実行してみると、

と表示される。一応の目的(クリックするまで表示される)を達成することは可能だ。

MessageBoxButtons(APIリファレンス)では、

[System.Windows.Forms.MessageBoxButtons]::OK,

のOK部分を以下のように変えると表示されるボタンをいくつかの種類に変えられる。

また、アイコンを変えるにはSystem.Windows.Forms.MessageBoxIcon(APIリファレンス)の::Errorを変えればよい。
"エラー表示"は注意は引けるが、システムエラーと勘違いするのでよくない。やはりWarningを指定しよう。

[System.Windows.Forms.MessageBoxIcon]::Warning

○日々の運用を考えてカスタマイズしてみる

毎朝、定時にPC画面に表示されるという何よりも最優先なアテンションを構築したわけだ。ここに表示されるメッセージは、デスクトップに配置したtestMorning.ps1ファイルをテキストエディターで文言を変えるだけで、翌日から反映されるが、幅を持たせ箇条書きにしておくとよいだろう。PowerShellのヒアドキュメント@"...."@で囲んでおけば、箇条書きを含むそのままの形で表示される。

Add-Type -AssemblyName System.Windows.Forms

$msg = @"
9時です。メールを開く前にやること

・その日の提出物確認
・スマホやモバイル端末の充電状況確認
・無駄なメールは後回し

※メールを先に開くと負けです
"@

[System.Windows.Forms.MessageBox]::Show(
$msg,
"朝通知",
[System.Windows.Forms.MessageBoxButtons]::OKCancel ,
[System.Windows.Forms.MessageBoxIcon]::Warning)

提出物はSaaSでブラウザから行えるので、リンクで目的地を設定しておけば一段と機能がグレードアップする。[ok]を押したらStart-Processを使ってブラウザでURLを開く処理を追加する。

Add-Type -AssemblyName System.Windows.Forms

$msg = @"
9時です。メールを開く前にやること

・その日の提出物確認
・スマホやモバイル端末の充電状況確認
・無駄なメールは後回し

※メールを先に開くと負けです
"@

$result = [System.Windows.Forms.MessageBox]::Show(
$msg,
"朝通知",
[System.Windows.Forms.MessageBoxButtons]::OKCancel,
[System.Windows.Forms.MessageBoxIcon]::Warning
)

if ($result -eq "OK") {
Start-Process "https://news.mynavi.jp/"
}

タスクスケジューラーからテスト実行してみる。

こうしておけば、メールを開く前に最優先の処理が自動的に行える。とりあえずは機能しそうだ。
しばらく使ってみようと思った次第である。
編集部おすすめ