メッセージボックスのボタンの文字列を変更するには

解決


アクエ  2006-08-30 19:11:08  No: 62866

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);
}


dairygoods  2006-08-30 22:23:29  No: 62867

nCode で区別できませんか?

想像ですが、例えば、HCBT_CREATEWND(ウィンドウの作成)は、
メッセージボックスでしか起こらないような気がします。
(ダイアログはフックを仕掛ける前に作成されているので)


アクエ  2006-08-30 23:06:43  No: 62868

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);
}


dairygoods  2006-08-30 23:20:12  No: 62869

単純に区別できないとなると、
あとはウィンドウの特徴等から
適切な判断を下すしかないと思います。

例1) ウィンドウタイトルで区別する。
例2)アクティブになった最初のウィンドウをメッセージボックスとする。
例3)ダイアログのHWNDを保存しておいて、それと一致しない場合メッセージボックスと判断する。


アクエ  2006-08-31 18:37:38  No: 62870

dairygoodsさん返信ありがとうございます。

やっぱり自力で対応するしかないのですか。
ウィンドウの特徴で判断して対応しようと思います。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加