TNB Library
クラス | 静的公開メンバ関数 | 全メンバ一覧
CWindowsHooker クラス

ウィンドウズフック管理 [詳解]

#include <TnbWindowsHooker.h>

静的公開メンバ関数

static HHOOK Hook (int iHookType, HOOKPROC PF)
 [登録] フック登録 [詳解]
 
static void OnDllMain (HANDLE hModule, DWORD reason)
 [設定] DllMain 時の処理 DLL のメイン関数がコールされた時にコールする関数です。 reason によって、処理を行います。 [詳解]
 
static void SetEnvironment (HINSTANCE hInstance, DWORD dwThreadId=0)
 [設定] 環境登録 [詳解]
 
static bool Unhook (int iHookType)
 [登録] フック解除 [詳解]
 
static void UnhookAll (void)
 [登録] 全フックリスナー解除 [詳解]
 

詳解

ウィンドウズフック管理

クラス関数しか有りません。インスタンスを作成することは出来ません。

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)
{
CWindowsHooker::OnDllMain(hModule, reason);
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_hook = CWindowsHooker::Hook(WH_CALLWNDPROC, s_hookProc);
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.h183 行目に定義があります。

関数詳解

◆ Hook()

static HHOOK Hook ( int  iHookType,
HOOKPROC  PF 
)
static

[登録] フック登録

覚え書き
指定タイプのフックを開始します(リスナーがコールされるようになります)。
引数
iHookTypeフックタイプ。 WH_MOUSEなど、WH_〜 で始まるシンボルを指定します。
PFHOOKPROC型のプロシージャ関数。( LRESULT CALLBACK (*HOOKPROC)(int, WPARAM, LPARAM) )
戻り値
NULL以外フックハンドル。記憶しておき、PF内で CallNextHookEx() の第一引数に使用してください。
NULL失敗。

TnbWindowsHooker.h274 行目に定義があります。

◆ OnDllMain()

static void OnDllMain ( HANDLE  hModule,
DWORD  reason 
)
static

[設定] DllMain 時の処理 DLL のメイン関数がコールされた時にコールする関数です。 reason によって、処理を行います。

覚え書き
DLL_PROCESS_ATTACH 時には、モジュールのハンドルを記憶します。 DLL_PROCESS_DETACH 時には、すべてのフックを解除します。
引数
hModuleDllMain の第一引数を渡します。
reasonDllMain の第二引数を渡します。

TnbWindowsHooker.h235 行目に定義があります。

◆ SetEnvironment()

static void SetEnvironment ( HINSTANCE  hInstance,
DWORD  dwThreadId = 0 
)
static

[設定] 環境登録

覚え書き
登録できるのは、プロセスで一つだけです。
引数
hInstanceインスタンスハンドル。ローカルフックの場合 NULL を指定します。
dwThreadIdスレッドID。省略すると0が設定されます。
※スレッドID に0を指定すると、既存のすべてのスレッドに関連付けられます。

TnbWindowsHooker.h260 行目に定義があります。

◆ Unhook()

static bool Unhook ( int  iHookType)
static

[登録] フック解除

覚え書き
指定タイプのフックを解除します。
引数
iHookTypeフックタイプ。 WH_MOUSEなど、WH_〜 で始まるシンボルを指定します。
戻り値
true成功。
false失敗。

TnbWindowsHooker.h289 行目に定義があります。

◆ UnhookAll()

static void UnhookAll ( void  )
static

[登録] 全フックリスナー解除

TnbWindowsHooker.h299 行目に定義があります。