メッセージボックスのボタン表記を書き換える

メッセージボックス( AfxMessageBox?()やMessageBox?)の
ボタン表示は、IDOKやIDCANCELが指し示すオブジェクト
に関連付けられており、
通常はどうやっても変更することはできませんが、
フック(ローカルフック)を使った方法で
変更することが可能です。

フックでボタン文字を変えたメッセージボックスのサンプル画像
msgbox.jpg

フックとは、ウィンドウズのシステムから、
アプリケーションウィンドウへ流れるメッセージの流れから、
釣り糸でひっかけるように
特定のものを拾い上げ、横取りしてしまい、
ウィンドウに渡る前に何かの処理をしてしまうという手法です。
「フックとは」(リンク先はかなり詳細なので適当に読んでください)
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.html

今回使う「ローカルフック」は、
自分自身のスレッドのみを対象としたフックです。

サンプルプログラムとプロジェクトファイル(VC++6.0)のダウンロード

日付ファイル
2007/06/06fileLocalHookDialogSample2.zip(519 KB) ヘッダとソースを分けたもの
2007/06/05(旧) fileLocalHookDialogSample.zip(519 KB)

手順

・フック状態を維持するフックハンドル変数

MyHookHandle

・フック処理の内容を記述するフック関数

MsgBoxHookProc()

・フックされたメッセージボックスを呼び出す関数

AfxMessageBoxHooked()

・OKボタンとキャンセルボタンの変更後の内容テキストを定義する定数

strOK,strCancel

を、グローバル宣言したヘッダファイル(HookMsgBox?.h)を作ります。

それを使いたいファイルでincludeし、
AfxGetMessageBoxHooked?()を呼び出すことで使います。

説明

フック関数MsgBoxHookProc?の中では、ボタン表記を書き換え、
書き換えた後でフック関数をアンインストールする処理を行っています。

OKボタン、キャンセルボタンの表記を変えるには、
HookMsgBox?.cppの、strOK,strCancelの値の部分を書き換えてください。

"HookMsgBox?.h"のソース

  1
  2
  3
  4

"HookMsgBox?.cpp"のソース

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49

使いたいファイルで、includeし、

#include "HookMsgBox.h"

フックされたメッセージボックス関数を呼び出す

AfxGetMessageBoxHooked("フックメッセージボックス", MB_OKCANCEL);

コメント