我创建了一个全局键盘钩。
挂钩是在DLL中创建的。
#pragma comment(linker, "/SECTION:.SHARED,RWS")
#pragma data_seg(".SHARED")
static HHOOK hkb=NULL;
static CMyFile *pLF;
#pragma data_seg()
HINSTANCE hins = NULL;
extern "C"
LRESULT __declspec(dllexport) __stdcall CALLBACK KeyBoardHookProc(
int nCode,
WPARAM wParam,
LPARAM lParam)
{
if (nCode < 0) {
return CallNextHookEx(0, nCode, wParam, lParam);
}
return CallNextHookEx(hkb, nCode, wParam, lParam);
}
extern "C"
LRESULT __declspec(dllexport) __stdcall CALLBACK Install()
{
pLF = new CMyFile(L"c:\\1.txt");
hkb = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardHookProc,hins,0);
return 0;
}
extern "C"
BOOL __declspec(dllexport) __stdcall CALLBACK UnInstall()
{
return UnhookWindowsHookEx(hkb);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH :
hins = (HINSTANCE) hModule;
break;
case DLL_THREAD_ATTACH :
break;
case DLL_THREAD_DETACH :
break;
case DLL_PROCESS_DETACH :
break;
}
return TRUE;
}
我开了一个EXe来加载此dll并调用hook dll的安装功能。
HMODULE hMod = LoadLibrary(L"hk.dll");
if(hMod!=NULL)
{
typedef LRESULT (__stdcall CALLBACK *_installhk)() ;
_installhk installProc;
installProc = (_installhk) GetProcAddress(hMod,"Install");
if(installProc!=NULL)
{
installProc();
}
}
当我启动exe时,在KeyBoardHookProc上调试断点仅被击中一次。
除非关闭它,否则exe会继续运行,但是如果我从键盘输入其他任何内容,钩子(Hook)过程将不会被调用。
这可能是什么原因?
这不是设置全局键盘挂钩的正确方法吗?
最佳答案
您如何测试未调用钩子(Hook)程序?如果您尝试使用断点进行检查,则必须注意在每个进程中都将钩子(Hook)dll加载,但断点仅放在当前进程中。
如果您的应用程序中有任何窗口,请在点击键或使用日志对其进行调试之前先将其聚焦。
另一个解决方案是使用WH_KEYBOARD_LL进行钩挂,不需要额外的DLL。您可以直接从过程中进行挂钩。