• ベストアンサー

メッセージボックスの選択ボタンのテキストを変更したい

メッセージボックスに表示される はい、いいえ、キャンセルのボタンのテキストを 自由に変更したいのですが何か良い方法があったら教えてください。 フォームを作ってメッセージボックスと同じものを作る方法ではなく、 MsgBox関数で表示されるものを変更したいです。 考え付いた方法ですが、メッセージボックスが表示された直後に APIのFindWindowなどでハンドルを調べて SendMessageでテキストを変更しようと思うのですが、 もっと良い方法があったらご教授いただけないでしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 > SendMessageでテキストを変更しようと思うのですが、 #1 ご回答のとおり、その方法では無理ですよ。環境が書いてありませんが、 VB6/VBA なら次のような方法で可能です。 Option Explicit Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _     ByVal idHook As Long, _     ByVal lpfn As Long, _     ByVal hmod As Long, _     ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" ( _     ByVal hHook As Long) As Long Private Declare Function CallNextHookEx Lib "user32" ( _     ByVal hHook As Long, _     ByVal ncode As Long, _     ByVal wParam As Long, _     ByRef lParam As Any) As Long Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" ( _     ByVal hWnd As Long, _     ByVal lpClassName As String, _     ByVal nMaxCount As Long) As Long Private Declare Function SetDlgItemText Lib "user32.dll" Alias "SetDlgItemTextA" ( _     ByVal hDlg As Long, _     ByVal nIDDlgItem As MSGBOXCTRLID, _     ByVal lpString As String) As Long Private Const WH_CBT    As Long = 5 Private Const HCBT_ACTIVATE As Long = 5 Private Const MAX_PATH   As Long = 260 ' // Msgbox Ctrl ID Public Enum MSGBOXCTRLID     MSGBTN_OK = &H1     MSGBTN_CANCEL = &H2     MSGBTN_ABORT = &H3     MSGBTN_RETRY = &H4     MSGBTN_IGNORE = &H5     MSGBTN_YES = &H6     MSGBTN_No = &H7 End Enum Private mhHook As Long ' // Msgbox フックプロシージャ Public Function MsgboxHookProc( _   ByVal lMsg As Long, _   ByVal wParam As Long, _   ByVal lParam As Long _ ) As Long      Dim sClassName As String   Dim lRet    As Long            If lMsg = HCBT_ACTIVATE Then     sClassName = Space$(MAX_PATH)     lRet = GetClassName(wParam, sClassName, MAX_PATH)     If Left$(sClassName, lRet) = "#32770" Then       SetDlgItemText wParam, MSGBTN_YES, "戦う"       SetDlgItemText wParam, MSGBTN_No, "逃げる"       SetDlgItemText wParam, MSGBTN_CANCEL, "道具"       UnhookWindowsHookEx mhHook     End If   End If   CallNextHookEx mhHook, lMsg, wParam, lParam End Function Public Sub MsgBoxSample()      Dim iRes As VbMsgBoxResult      ' // MsgBox の直前でフックプロシージャを呼び出してテキストを書き換えます   mhHook = SetWindowsHookEx(WH_CBT, _                AddressOf MsgboxHookProc, _                0&, _                GetCurrentThreadId)   iRes = MsgBox("スライムが現れた!", vbYesNoCancel Or vbInformation)      ' // フックプロシージャ内で Unhook しているので、以降のMsgBox には影響なし   MsgBox iRes, vbYesNoCancel Or vbInformation    End Sub

gomachans1
質問者

お礼

KenKen_SP様 ご回答ありがとうございます。 サンプルまで書いて頂いて大変恐縮です。 環境を書いていなくて申し訳ございませんでした。 当方VB.NETの環境なので、ところどころ変更が必要に なりそうですが、試してみようと思います。 一箇所変更に難しそうなところがあるのでそれが気になるところですが、 また質問がお目に留まりましたらご助言頂けたら幸いです。 ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのような文言にしたいのでしょう? 組み込みダイアログなので自由な設定は出来ません MsgBox関数はモーダル表示なので MsgBox関数を発行したアプリからの操作は不能です Sub Macro1   dim n as integer   n = 3   MsgBox "こんにちは", vbOkOnly   n = 5 End Sub といったコードがあった場合 MsgBox関数から制御が戻ってこないとn=5の行は実行されません 普通はMsgBoxのインターフェイスに似たフォームを作成して使うといった手法になると思います

gomachans1
質問者

お礼

redfox63様 ご回答ありがとうございます。 確かにご指摘の通りでした。 やっぱり普通にフォームを作る方法が一番簡単そうですね。 でも、表示時間とかウィンドウに隠れたりなどという挙動が MsgBoxと全く同じようにしたいので、まずはKenKen_SP様の方法に 挑戦してみたいと思います。 ありがとうございました。

関連するQ&A