前回、毎朝必要なメッセージの通知を試みた筆者、アイコンとメッセージは設定時刻に表示されて、メールボックスを先に開くと忘れがちになる"クリックするだけの"デイリータスクを無事に処理することができたのだが、ひとつの課題が生じた。
○NotifyIconで生じた課題
task.ShowBalloonTip(300000, "9時通知", "おい貴様、起きろ!朝9時だ。
で設定した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を変えればよい。
[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/"
}
タスクスケジューラーからテスト実行してみる。
こうしておけば、メールを開く前に最優先の処理が自動的に行える。とりあえずは機能しそうだ。











![[USBで録画や再生可能]Tinguポータブルテレビ テレビ小型 14.1インチ 高齢者向け 病院使用可能 大画面 大音量 簡単操作 車中泊 車載用バッグ付き 良い画質 HDMI端子搭載 録画機能 YouTube視聴可能 モバイルバッテリーに対応 AC電源・車載電源に対応 スタンド/吊り下げ/車載の3種類設置 リモコン付き 遠距離操作可能 タイムシフト機能付き 底部ボタン 軽量 (14.1インチ)](https://m.media-amazon.com/images/I/51-Yonm5vZL._SL500_.jpg)