どうも、あまりの初心者で申し訳ありません。
次のコードをDLLに書いたのですが。
HHOOK g_hHookWnd = NULL;//フックのハンドル
HINSTANCE g_hDll = NULL;//DLLのインスタンスハンドル
//エントリポイント
BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID
lpReserved)
{
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
g_hDll=hInstance;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// フックするプロシジャー
LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode == HC_ACTION )
{
MessageBox( NULL , GET,確認 ,MB_OK | MB_TOPMOST );
//ここが2回走る
}
return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
//フックインストール
__declspec( dllexport ) void CALLBACK HookInstall(void)
{
if ( g_hDll == NULL ) return;
g_hHookWnd = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)MyCallWndProc,
g_hDll, 0 );
if ( g_hHookWnd == NULL){
MessageBox(NULL,フック失敗,エラー,MB_OK | MB_TOPMOST);
}
}
// フックアンインストール
__declspec( dllexport ) void CALLBACK HookUninstall(void)
{
if ( g_hHookWnd != NULL){
UnhookWindowsHookEx(g_hHookWnd);
}
}
キーを一つ叩いただけで、メッセージが2回出ます。僕の推察では、WM_KEYDOWNと
WM_KEYUPが個別に認識されているせいだと思うのですが。WM_KEYDOWNだけ認識するよう
にするためには、MyHookProcをどう変えればよいのでしょうか、教えてください。
自己解決ですいません。
lParamの4バイトめが0x80ならWM_KEYUPなのですね。
ちなみに、このソースはBorland C++Builder 6.0 で書いているのですが、余裕でグロー
バルフック出来るみたいです。
SetWindowsHookExの第4引数を只単に0にしたら良いみたいです。厳密な、システムフッ
クではないですが同じ効果が得られると、初心者ながらに感じています。
「lParamの4バイトめが0x80なら」ではなく、
「ビット演算して最上位ビットがたっていれば」では?
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_keyboardproc.htm