我创建了一个全局键盘钩。

挂钩是在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。您可以直接从过程中进行挂钩。

07-24 09:37
查看更多