全局键盘挂钩不起作用

ana*_*and 3 c++ winapi keyboard-hook

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

挂钩是在 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;
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个加载这个 dll 并调用钩子 dll 的安装函数的 EXe。

 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();
       }
   }
Run Code Online (Sandbox Code Playgroud)

当我启动 exe 时,KeyBoardHookProc 上的调试断点只被命中一次。

除非我关闭它,否则 exe 会继续运行,但如果我从键盘输入任何其他内容,则不会调用挂钩程序。

这可能是什么原因?

这不是设置全局键盘挂钩的正确方法吗?

Emm*_*dec 5

您是如何测试未调用挂钩程序的?如果你试图用断点检查它,你必须注意你的钩子 dll 被加载到每个进程中,但你的断点只放在你当前的进程中。

如果您的应用程序中有任何窗口,请在敲击键之前关注它或使用日志对其进行调试。

另一种解决方案是使用不需要额外 DLL 的 WH_KEYBOARD_LL 挂钩。您可以直接从您的流程中挂钩。