VC6.0 MFCを使用しています。
メッセージボックスのボタンの文字列の変更はフックを使えば出来ることがわかり
フックを使用してボタン(IDOKとIDCANCEL)の文字列の変更には成功しました。
問題なのは、メッセージボックスはダイアログから呼ばれるようになっており、
ダイアログ上にも[IDOK]と[IDCANCEL]があるためダイアログ上のボタンの文字列も変更されてしまいます。
メッセージボックス上のボタンの文字列のみ変更することは可能でしょうか?
わかる方がいましたら教えてください。お願いします。
hook = SetWindowsHookEx ( WH_CBT, MsgBoxHookProc, NULL, GetCurrentThreadId( ) );
MessageBox("フックテスト","Hook",MB_OKCANCEL);
ret = UnhookWindowsHookEx ( hook );
LRESULT CALLBACK MsgBoxHookProc (int nCode, WPARAM wParam ,LPARAM lParam )
{
if (nCode >= 0)
{
SetDlgItemText( ( HWND )wParam, IDOK, "フックテストボタン1" );
SetDlgItemText( ( HWND )wParam, IDCANCEL, "フックテストボタン2" );
}
return CallNextHookEx ( hook, nCode, wParam, lParam);
}
nCode で区別できませんか?
想像ですが、例えば、HCBT_CREATEWND(ウィンドウの作成)は、
メッセージボックスでしか起こらないような気がします。
(ダイアログはフックを仕掛ける前に作成されているので)
dairygoodsさん返信ありがとうございます。
さっそくHCBT_CREATEWNDで区別する方法をためしてみたのですが
HCBT_CREATEWNDではメッセージが変更されませんでした。
色々試してみた結果HCBT_ACTIVATEだと文字列が変更されるのですが、
これだとダイアログもアクティブになった瞬間にフックしてしまうのでうまくいきません。
自分のソースが悪いのでしょうか?
LRESULT CALLBACK MsgBoxHookProc (int nCode, WPARAM wParam ,LPARAM lParam )
{
if (nCode >= 0)
{
if(nCode == HCBT_CREATEWND){
SetDlgItemText( ( HWND )wParam, IDOK, "フックテストボタン1" );
SetDlgItemText( ( HWND )wParam, IDCANCEL, "フックテストボタン2" );
}
}
return CallNextHookEx ( hook, nCode, wParam, lParam);
}
単純に区別できないとなると、
あとはウィンドウの特徴等から
適切な判断を下すしかないと思います。
例1) ウィンドウタイトルで区別する。
例2)アクティブになった最初のウィンドウをメッセージボックスとする。
例3)ダイアログのHWNDを保存しておいて、それと一致しない場合メッセージボックスと判断する。
dairygoodsさん返信ありがとうございます。
やっぱり自力で対応するしかないのですか。
ウィンドウの特徴で判断して対応しようと思います。
本当にありがとうございました。
ツイート | ![]() |