PowerShell 2.0 でのMessageBox

PowerShellGUIアプリを作るには、基本的にはオブジェクトを作成してメソッドを実行することになりますが、コンストラクタが無いオブジェクトはクラスメソッドを使うことになるようです。
今回は、MessageBoxを開くため、Showメソッドを使ってみます。MessageBox1.ps1というファイル名で保存します。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト")

実行すると、「テスト」と書かれたダイアログボックスが開きますがあまりにもシンプルですね。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.messagebox.aspx を見ながらShow()メソッドをいろいろ試してみます。

スクリプトの実行がシステムで無効になっているため、ファイル MessageBox1.ps1 を読み込めません。詳細については、「get-help about_signing」と入力してヘルプを参照してください。
At line:0 char:0

みたいになる場合は、rub.batというファイルを作って、そこにDrag & Dropしてください。run.batは以下のとおり。

PowerShell -Sta -WindowStyle Hidden -Command "Get-Content %1 | Invoke-Expression"

さて、Showメソッドって、たくさんあります。第一引数が文字列の場合とIWin32Windowの場合で挙動が異なりますが、IWin32Windowsの場合はその前面にMessageBoxを表示するものになるようです。今回はMessageBoxを表示するだけなので、IWin32Windowsを使いませんが、実際にプログラムを作るときには、MessageBoxが後ろに表示されて見えなくなるので、必ずIWin32Windowsを第一引数にとるように記述したほうがよいでしょう。

では、第一引数が文字列の場合からの説明です。この第一引数は、MessageBoxに表示される文字列になります。最初に書いたスクリプトでは"テスト"と表示されました。

第二引数がある場合は、それがウィンドウのタイトルバーに表示される文字列になります。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト", "キャプション")

第三引数がある場合は、ボタンの種類になります。しかし、MessageBoxButtonsの指定方法が分からないので、強引なことをやってみます。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト", "キャプション", "")

このように第三引数を""というから文字列にすると、エラー表示してくれます。

"Show" の引数 "2" (値 "") を型 "System.Windows.Forms.MessageBoxButtons" に変換できません: "列挙値が無効なため、値 "" を型 "System.Windows.Forms.MessageBoxButtons" に変換できません。次のいずれかの列挙値を指定し、再試行してください。有効な列挙値: "OK、OKCancel、AbortRetryIgnore、YesNoCancel、YesNo、RetryCancel"。"
発生場所 行:1 文字:40
+ [System.Windows.Forms.MessageBox]::Show <<<< ("テスト", "キャプション", "")
    + CategoryInfo          : NotSpecified: (:) []、MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

エラーを見ると、"OK" "OKCancel" "AbortRetryIgnore" "YesNoCancel" "YesNo" RetryCancel"の6種類が使えるようです。早速"YesNoCancel"にしてみます。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト", "キャプション", "YesNoCancel")

ボタンが3つあるメッセージボックスが表示されました。

第四引数は、アイコンです。同じように第四引数を空文字列にして実行し、有効な値を調べます。"None" "Hand" "Error" "Stop" "Question" "Exclamation" "Warning" "Asterisk" "Information"の9個あるようです。"None"では何も表示されないので、"Asterisk"にしてみます。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト", "キャプション", "YesNoCancel", "Asterisk")

InformationとAsteriskの違いがよく分かりませんが、一応アイコンは表示されました。

第五引数は、デフォルトボタンです。有効な値は、"Button1" "Button2" "Button3"の3つです。MessageBoxに並んだボタンの左から指定できるようです。ボタンの数より大きい数字を指定すると、一番左がデフォルトボタンになるようです。今回はYesNoCancelの3つボタンを用意しているので、Button3にしてみます。

Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("テスト", "キャプション", "YesNoCancel", "Asterisk", "Button3")

正しく3番目のキャンセルボタンがデフォルト表示になってます。

第六引数は、MessageBoxOptionsだそうです。よく分かりませんね。有効な値は、"DefaultDesktopOnly" "RightAlign" "RtlReading" "ServiceNotification"のようです。試してみると右揃えになったり、左右反転したりするようで、、、指定する必要はないのかな?"ServiceNotification"だけはよくわかりません。

第七引数以降はヘルプメッセージのようです。しかし、この辺からはよく分からないので、今回はここまでです。

New-Objectでインスタンスを作成するのではなく、クラスの静的メソッドを使う場合はクラスを[System.Windows.Forms.MessageBox]のように指定し、そのメソッドを::Show()のように書くことで、.NET FrameWorkをたたけることと、列挙子の指定は文字列で行うことが分かりました。分からない場合は空の文字列を突っ込んで、エラー表示を出すとそこにヒントが隠されています。Windowsのエラーメッセージって親切になったんだな〜と感じた今日この頃です。