[AHK応用] メッセージボックスのボタンの文字を変更する
2018/04/07
MsgBox で表示されるメッセージボックスのボタンを、任意の文字列に変更する方法です。
決められたボタン以外を表示する
MsgBox に表示できるボタンは、「はい」「キャンセル」「再試行」などの決められた文字列・組み合わせしか利用できません。
しかし、この方法を使えばこんなメッセージボックスを利用できます。
もちろん MsgBox の利点の一つである IfMsgBox も利用可能です。
ソースコード
AutoHotkeyをインストールした環境で以下を拡張子「.ahk」で保存すれば、そのまま実行できます。
#SingleInstance SetTimer, rChangeButtonNames, 50 MsgBox, 0x4, メッセージボックステスト, ボタンを押してください。 IfMsgBox, YES MsgBox, 「追加」が押されました。 else MsgBox, 「削除」が押されました。 return rChangeButtonNames: IfWinNotExist, メッセージボックステスト return ; MsgBox が表示されるのを待ちます SetTimer, rChangeButtonNames, Off WinActivate ControlSetText, Button1, 追加(&A) ControlSetText, Button2, 削除(&D) return
解説
この例では「はい」ボタンを「追加」に、「いいえ」ボタンを「削除」に変更しています。MsgBox コマンドだけではボタンの文字を自由に設定できませんが、他のコマンドを組み合わせることで実現しています。
まず、50msec ごとに rChangeButtonNames ルーチンを実行するように SetTimer で設定しておきます。rChangeButtonNames ルーチンでは、最初にウインドウタイトルが「メッセージボックステスト」に一致するウインドウがあるかチェックし、無ければその回は何もせずにルーチンを終えています。
MsgBox では、「はい」「いいえ」になるように Options に 0x4 を与えて表示させます。ウインドウタイトルは「メッセージボックステスト」にします。
メッセージボックスを表示すると、50msec ごとに繰り返し実行している rChangeButtonNames ルーチンがこれを検知します。まずルーチンを実行するタイマーを止め、メッセージボックス内のボタンコントロールに対して、文字列の変更をかけます。
ボタンの文字列は変更されましたが、 IfMsgBox で検出するユーザーの操作は元のボタンのままであるため、IfMsgBox, Yes でこれを検知できます。
ポイント
メッセージボックスのウインドウの検知、ボタンの変更にウインドウタイトルを使っているため、ウインドウタイトルが他のウインドウとかぶってしまうとうまく実行できなくなります。
より確実な実行とするためには、ウインドウクラスやウインドウハンドルを用いるとよいでしょう。