メッセージボックスに表示される
はい、いいえ、キャンセルのボタンのテキストを
自由に変更したいのですが何か良い方法があったら教えてください。
フォームを作ってメッセージボックスと同じものを作る方法ではなく、
MsgBox関数で表示されるものを変更したいです。
考え付いた方法ですが、メッセージボックスが表示された直後に
APIのFindWindowなどでハンドルを調べて
SendMessageでテキストを変更しようと思うのですが、
もっと良い方法があったらご教授いただけないでしょうか。
よろしくお願い致します。
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
KenKen_SP様
ご回答ありがとうございます。
サンプルまで書いて頂いて大変恐縮です。
環境を書いていなくて申し訳ございませんでした。
当方VB.NETの環境なので、ところどころ変更が必要に
なりそうですが、試してみようと思います。
一箇所変更に難しそうなところがあるのでそれが気になるところですが、
また質問がお目に留まりましたらご助言頂けたら幸いです。
ありがとうございました。
No.1
- 回答日時:
どのような文言にしたいのでしょう?
組み込みダイアログなので自由な設定は出来ません
MsgBox関数はモーダル表示なので MsgBox関数を発行したアプリからの操作は不能です
Sub Macro1
dim n as integer
n = 3
MsgBox "こんにちは", vbOkOnly
n = 5
End Sub
といったコードがあった場合 MsgBox関数から制御が戻ってこないとn=5の行は実行されません
普通はMsgBoxのインターフェイスに似たフォームを作成して使うといった手法になると思います
redfox63様
ご回答ありがとうございます。
確かにご指摘の通りでした。
やっぱり普通にフォームを作る方法が一番簡単そうですね。
でも、表示時間とかウィンドウに隠れたりなどという挙動が
MsgBoxと全く同じようにしたいので、まずはKenKen_SP様の方法に
挑戦してみたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
- その他(メールソフト・メールサービス) サンダーバードメールの着信表示をさせない 1 2022/11/15 10:00
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/04/21 13:46
- その他(パソコン・周辺機器) EXCELで「WEBオプションの対象ブラウザ」を変更する方法 2 2023/04/12 15:44
- Excel(エクセル) こんなことできますか?例えば、sheetに貼り付けた図形のタイトルを、セルA1の文字で表示する。 5 2022/04/22 15:25
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Excel(エクセル) エクセルの数式について教えてください。 1 2023/02/11 15:17
- Excel(エクセル) エクセルの数式で教えてください。 1 2022/10/25 09:26
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
メッセージボックスのボタン名変更
Visual Basic(VBA)
-
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
エクセルVBAで、ボタンの文字を変えたい
Excel(エクセル)
-
5
フォントの大きさ
Visual Basic(VBA)
-
6
Msgboxの×が押されたとき
Excel(エクセル)
-
7
メッセージボックスのボタン文字を英語表示にしたい
Visual Basic(VBA)
-
8
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
11
画面を強制的に再描画させる方法
C言語・C++・C#
-
12
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
13
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
14
ShowAllDataのエラーを回避したい
Access(アクセス)
-
15
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
16
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
17
セルにカーソルを合わせると文字を表示させるVBA
Excel(エクセル)
-
18
ユーザーフォームにワークシートを表示させる。
その他(Microsoft Office)
-
19
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
20
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
VBAでコントロールのハンドルを...
-
MFC利用/WinMainCRTStartup
-
アプリケーション間での操作
-
msgboxの表示位置
-
textboxに文字列を挿入したい。
-
WM_NCLBUTTONUPについて
-
VBA 複数セルが空白なら印刷さ...
-
MQプログラミング MQGetの手法...
-
警告メッセージのセキュリティ...
-
16進数入力制限方法
-
SetWindowText関数について
-
VBでRegisterWindowMessage関数...
-
vbaから他のアプリを終了
-
WM_CLEARなど使えないメッセー...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
フォームでPDFを表示させた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報