2006/07/14
タスクトレイアイコンの表示
.NET Framework 2.0にはタスクトレイにアイコンを表示させるためのクラス、NotifyIconクラスがあります。これを使ってみましょう。
function CreateNotifyIconMenu() { # menuItem1オブジェクトの作成 $menuItem1 = new-object System.Windows.Forms.MenuItem("終了(&X)") # Clickイベント $menuItem1.Add_Click({Form_Closing}) # contextMenuオブジェクトの作成 $contextMenu = new-object System.Windows.Forms.ContextMenu # menuItemオブジェクトをcontextMenuオブジェクトのMenuItemsコレクションに追加 [void]$contextMenu.MenuItems.Add($menuItem1) #↑ここの[void]を忘れるとAddメソッドの戻り値がreturnされてしまう。 return ($contextMenu) } function Form_Closing() { # フォームとシステムトレイアイコンを非表示に $form.Visible = $false $notifyIcon.Visible = $false # PowerShellの終了 [System.Environment]::Exit(0) } [void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void] [System.Windows.Forms.Application]::EnableVisualStyles() # notifyIconオブジェクトの作成とプロパティの設定 $notifyIcon = new-object System.Windows.Forms.NotifyIcon # System.Drawing.Iconクラスのコンストラクタにはicoファイルのパスを指定する $notifyIcon.Icon = new-object System.Drawing.Icon C:\script\test\a.ico $notifyIcon.Text = "PowerShell実行中" $notifyIcon.ContextMenu = CreateNotifyIconMenu $notifyIcon.Visible = $true # formオブジェクトの作成 $form = new-object System.Windows.Forms.Form # Closingイベント $form.Add_Closing({Form_Closing}) # フォームの表示 [void]$form.showDialog()
理論上はフォームを表示させなくても良いはずなんですが、ループをまわすいい方法が思いつきませんでした(start-sleepを使うとその間イベントが実行されない)。あと、showDialogで表示したフォームを閉じるいい方法も思いつかなかったので[System.Environment]::Exit(0)
としてPowerShell自体のプロセスを終了させています(exitとやるとエラーが出るんですよね。なんでしょうこれは)。これらに対する良い解決策をお持ちの方は教えてください。
PowerShellのfunctionって引数がなしのとき、呼び出す際()を使うとエラーになるんですよね。あと、文頭に持ってこないといけないのも気に入りません。何とかならなかったのでしょうか…。
せっかくタスクトレイが使えるのに、フォームとコンソールまで表示されてしまいます。そこでWSHを併用してごまかす方法を。
Set WshShell=CreateObject("WScript.Shell") WshShell.Run "powershell test.ps1",0
このようなvbsファイルを作ってps1ファイルをキックしてやります。Runメソッドの第二引数に0を指定すると、コンソールおよびフォームが非表示になりますが、タスクトレイは表示されます。この手を使うとまるでタスクトレイだけが表示されているかのような状態を作り出せます。ちなみに、MessageBoxも同じようにそれだけを表示させることができます。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/07/14/32470.aspxプライバシーポリシー