- ベストアンサー
メッセージボックスの選択ボタンのテキストを変更したい
メッセージボックスに表示される はい、いいえ、キャンセルのボタンのテキストを 自由に変更したいのですが何か良い方法があったら教えてください。 フォームを作ってメッセージボックスと同じものを作る方法ではなく、 MsgBox関数で表示されるものを変更したいです。 考え付いた方法ですが、メッセージボックスが表示された直後に APIのFindWindowなどでハンドルを調べて SendMessageでテキストを変更しようと思うのですが、 もっと良い方法があったらご教授いただけないでしょうか。 よろしくお願い致します。
- gomachans1
- お礼率16% (3/18)
- Visual Basic
- 回答数2
- ありがとう数9
- みんなの回答 (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
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
どのような文言にしたいのでしょう? 組み込みダイアログなので自由な設定は出来ません 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
- Win32 API エディットボックス内文字列の色変更
Win32 APIについて質問です。 (Microsoft Visual Studio .NET 2002、XP、API) エディットコントロールに表示されている文字列の 色(またはフォント)を変更したいと思っています。 エディットボックスに「0」という数字を入力し その後「更新ボタン」をクリックすると、「0」の 文字色が赤色(または赤太文字)へ変更される という具合です。 Win32 APIを始めて間もない者(Cも始めて間もないです) なので、かなり苦戦しております。 「SendMessage() 」みたいな関数を使用しエディット ボックスのハンドルへメッセージを送ることで 実現させるのかなぁ程度しか理解しておりません。 ご存じの方すいませんがよろしくお願いします。
- ベストアンサー
- C・C++・C#
- テキストボックスの値変更時のイベント
フォーム上のテキストボックスに、前の画面で入力したデフォルト値が表示されている状態で、テキストボックスの値を変更したらJavaScriptの関数でチェックさせたいと考えているのですがうまくいきません。 onChangeイベントは値を変更(例えば削除するなど)して、Enterキーを押すなりフォーカスを移すなりしないとイベントが発生しないので、変更されたら即座にチェックということができません 何かうまい方法はないでしょうか?
- ベストアンサー
- JavaScript
- VBAにてメッセージボックスを最前面に表示させる
エクセルVBAにて、指定時刻になったらメッセージボックスを、最前面に表示させるプログラムを作成中です。 時刻の指定は、ontimeメソッドの使用でできました。 しかし、最前面(他のアプリケーションを開いていても、メッセージボックスが手前に表示される)がどうしてもできません。。 VBだとAPI関数を使って、フォームを常に最前面表示はできました。 メッセージボックスで、このような表示方法は実現可能なのでしょうか? どなたか教えて下さい。よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- フォームを表示してからメッセージボックスを表示する
メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" End Sub だと、先ほど述べたように、メッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを開いたときのイベントは複数あるようで、 Private Sub Form_Activate() MsgBox "Form_Activate" Debug.Print "Form_Activate" End Sub Private Sub Form_Current() MsgBox "Form_Current" Debug.Print "Form_Current" End Sub Private Sub Form_GotFocus() MsgBox "Form_GotFocus" Debug.Print "Form_GotFocus" End Sub Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" Debug.Print "Form_Open" End Sub Private Sub Form_Load() MsgBox "Form_Load" Debug.Print "Form_Load" End Sub をすると、 ・Form_Load ・Form_Activate ・Form_GotFocus ・Form_Open ・Form_Current の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルマクロのテキストボックスを選択したい
こんばんわ! エクセルマクロのユーザーフォームのテキストボックスを選択したままにしたいのですが、どうしたらよいでしょうか? 具体的には テキストボックスに値を打ち込みテキストボックスから移動すると確定?するようにしています。(下のプログラム) Private Sub textbox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) msgbox "aaa",vbinformation endsub これが動作した後、またtextbox1を選択状態にしたいです。 アドバイスの程よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
- 条件に該当したテキストボックスの名前を
はじめまして。 現在AccessでVBを書いているのですが少しわからない事が ありましたので質問させて下さい。 バージョンは2003です。 単票形式のフォームにて、既に作られているボタンを押すと あるテキストボックスの値が条件に該当する場合、テキストボックスの 色が黄色に変わるというVBが既に書かれています。 そのVBが実行された後、黄色に変わったテキストボックスだけの 名前をメッセージボックスに表示させたいのですが、 どのようなVBを書けばいいのでしょうか>< VB始めたばかりでまだよく理解できていないので ネットなどでいろいろ調べたのですがわからなくて… msgbox関数?を使えばいいのはわかるのですが。 良かったらご教授お願いします!
- ベストアンサー
- Visual Basic
- メッセージボックスの表示位置について
WindowsAPI(C言語)でメッセージボックスの表示位置を変更したいと思っています。 ダイアログボックスはSetWindowPosで変更できたのですが、メッセージボックスの表示位置が変更できずに困っています。 何か良いAPIや、実装方法などがありましたらご教授ください。 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- メッセージボックスのボタン名変更
VBメッセージボックスの「はい」「いいえ」などのボタンを、自分で指定したボタン名に変更できないでしょうか? やりたいことは、「言語を選択してください」という質問メッセージを表示して、これから行うアクションを、例えば、「日本語」「English」などで表示したいです。 イメージとしては、 language = MsgBox("言語を選択してください","日本語""English") If language = "日本語" Then 日本語処理 ElseIf language = "English" Then 英語処理 End If といった感じに処理を行いたいですが、メッセージボックスのボタンの文言変更は無理でしょうか? ちなみに、自分の環境は、OS:XP、VB6SP6です。
- 締切済み
- Visual Basic
- テキストボックスの値が変更になったら
ポイントを入力するテキストボックスが2つあって、 1つめのテキストボックスの値が変更されたら2つめの テキストボックスにもその変更された値を表示するとい う事は可能でしょうか? onChangeの処理かなーとも思ったのですが書き方がよく わかりません。 何か良い方法がありましたら教えて下さい。
- ベストアンサー
- JavaScript
- Win32 APIで、テキストボックスの文字サイズ変更について
Win32 APIで、テキストボックスの文字サイズを 変更したいのですが、どうすればいいのでしょうか。 テキストボックスのサイズ変更は出来ます。
- ベストアンサー
- C・C++・C#
お礼
KenKen_SP様 ご回答ありがとうございます。 サンプルまで書いて頂いて大変恐縮です。 環境を書いていなくて申し訳ございませんでした。 当方VB.NETの環境なので、ところどころ変更が必要に なりそうですが、試してみようと思います。 一箇所変更に難しそうなところがあるのでそれが気になるところですが、 また質問がお目に留まりましたらご助言頂けたら幸いです。 ありがとうございました。