ウィンドウズフック管理
クラス関数しか有りません。インスタンスを作成することは出来ません。
Hook() の戻り値は記憶しておき、登録した HOOKPROC 型のプロシージャ関数の最後で ::CallNextHookEx() に渡すようにしてください。
\code
static HWND s_hWnd = NULL;
static HHOOK s_hook = NULL;
LRESULT CALLBACK s_hookProc(int code, WPARAM wParam, LPARAM lParam)
{
if ( code == HC_ACTION ) {
const CWPSTRUCT * P = reinterpret_cast<const CWPSTRUCT *>(lParam);
if ( s_hWnd == P->hwnd ) {
::MessageBeep(MB_OK);
}
}
return ::CallNextHookEx(s_hook, code, wParam, lParam);
}
void TpHook(HWND hWnd)
{
CWindowsHooker::SetEnvironment(NULL, 0);
s_hook = CWindowsHooker::Hook(WH_CALLWNDPROC, s_hookProc);
s_hWnd = hWnd;
}
\endcode
- 覚え書き
- TnbWindowsHooker.h をインクルードする前にシンボル "TnbGLOBALHOOK" を定義し、本クラスをDLL内で使用すると、 グローバルフックも可能です。また、その際、共有セクション名は「.tnbwinhook」になっていますので、必要な変数は、 共有してください。
#pragma data_seg(".tnbwinhook")
static HWND s_hWnd = NULL;
static HHOOK s_hook = NULL;
#pragma data_seg()
BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
return TRUE;
}
LRESULT CALLBACK s_hookProc(int code, WPARAM wParam, LPARAM lParam)
{
if ( code == HC_ACTION ) {
const CWPSTRUCT * P = reinterpret_cast<const CWPSTRUCT *>(lParam);
if ( s_hWnd == P->hwnd ) {
::MessageBeep(MB_OK);
}
}
return ::CallNextHookEx(s_hook, code, wParam, lParam);
}
__declspec(dllexport) void TpHook(HWND hWnd)
{
s_hWnd = hWnd;
}
static HHOOK Hook(int iHookType, HOOKPROC PF)
[登録] フック登録
static void OnDllMain(HANDLE hModule, DWORD reason)
[設定] DllMain 時の処理 DLL のメイン関数がコールされた時にコールする関数です。 reason によって、処理を行います。
- 参照
- http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp
- 必要ファイル
- TnbWindowsHooker.h
- 日付
- 06/06/05 新規作成。
-
06/12/18 名前変更。
-
11/11/28 pragma 、コメント追加。 OnDllMain() 追加。
TnbWindowsHooker.h の 183 行目に定義があります。