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

NotifyIconで生じた課題

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

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

  • NotifyIconで300秒表示は無理

    NotifyIconで300秒表示は無理

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

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。表示されている瞬間に右クリックして"オフにする"を押せれば、止めることも可能だが

    回数分通知が終了するまで消すことができないNotifyIcon。表示されている瞬間に右クリックして"オフにする"を押せれば、止めることも可能だが

やはり、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

実行してみると、

  • OKボタンを押さないと閉じないMessageBox

    OKボタンを押さないと閉じないMessageBox

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

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

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

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

OK OKボタンのみ
OKCancel OKボタンとキャンセルボタン
AbortRetryIgnore 中止ボタンと再試行ボタンと無視ボタン
YesNoCancel はいボタンといいえボタンとキャンセルボタン
YesNo はいボタンといいえボタン
RetryCancel 再試行ボタンとキャンセルボタン
  • [System.Windows.Forms.MessageBoxButtons]::OKCancel,でOKボタンとキャンセルボタンを表示させたところ

    [System.Windows.Forms.MessageBoxButtons]::OKCancel,で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)
  • ヒアドキュメント@"...."@を変数$msgに入れて表示させたところ

    ヒアドキュメント@"...."@を変数$msgに入れて表示させたところ

提出物は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/"
}

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

  • OKボタンをクリックすると

    OKボタンをクリックすると

  • ブラウザが起動し記載したURLへとリンクが機能する

    ブラウザが起動し記載したURLへとリンクが機能する

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