做成全局钩子,放到一个dll中,全局变量要放到共享段中

解决方案 »

  1.   

    没错啊,我的钩子函数是放在dll中,就连setwindowshookex也是在dll中调用的啦。
      

  2.   

    而且在调试时,总是遇到这样的输出错误:

    First-chance exception in KeyWatch.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
    First-chance exception in KeyWatch.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
      

  3.   

    //in dll---------
    LRESULT CALLBACK KeyboardProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code
      LPARAM lParam   // keystroke-message information
    );
    //in dll---------//in execute module
    void set_hook()
    {
       void *pTemp;
       HANDLE hDllModule=LoadLibrary(DllFileName);
       *pTemp=GetProcAddress(hDllModule,"KeyboardProc");
       HOOK hkTemp=SetWindowsHookEx(WH_KEYBOARD,
                                    pTemp,
                                    hDllModule,
                                    0);
    }
    //in execute module记住unhook的时候要FreeLibrary(hDllModule);
      

  4.   

    #pragma data_seg(".ShareSeg")
    HHOOK hook = NULL;
    HWND hwnd = NULL;
    #pragma data_seg()#pragma comment(linker, "/SECTION:ShareSeg,RWS")
      

  5.   

    没有错,如果你要截获所有的WM_KEYDOWN消息,你必须用dll,设置钩子的时候是将你的代码注入其他进程空间。这样才可以。否则出来的就是你说的那个错误,就是因为你没有将代码注入其他进程空间。你的钩子设置已经成功,只是代码不能为其他进程合法访问的问题