プロが教えるわが家の防犯対策術!

メッセージボックスに表示される
はい、いいえ、キャンセルのボタンのテキストを
自由に変更したいのですが何か良い方法があったら教えてください。
フォームを作ってメッセージボックスと同じものを作る方法ではなく、
MsgBox関数で表示されるものを変更したいです。

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

A 回答 (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
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/07/13 16:03

どのような文言にしたいのでしょう?


組み込みダイアログなので自由な設定は出来ません
MsgBox関数はモーダル表示なので MsgBox関数を発行したアプリからの操作は不能です

Sub Macro1
  dim n as integer
  n = 3
  MsgBox "こんにちは", vbOkOnly
  n = 5
End Sub
といったコードがあった場合 MsgBox関数から制御が戻ってこないとn=5の行は実行されません

普通はMsgBoxのインターフェイスに似たフォームを作成して使うといった手法になると思います
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/13 16:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A