我用vc++写了个用于设全局钩子的的dll文件,主要代码如下
HINSTANCE g_hInstance = NULL; 
HHOOK  g_hHook = NULL;BOOL APIENTRY DllMain(HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
g_hInstance = (HINSTANCE)hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);
break;
}
    return true;
}extern "C" bool _declspec(dllexport) StartHook()
{
if (g_hHook != NULL) return false;
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KBHookProc, g_hInstance, 0);
if (g_hHook == NULL) return false;
return true; 
}extern "C" bool _declspec(dllexport) StopHook()
{
if (UnhookWindowsHookEx(g_hHook) == 0) return false;
g_hHook = NULL;
return true;
}然后我用其他的编程语言调用这个dll(如C#)结果这个钩子只对自己窗体有效,感觉并不是全局钩子,这是怎么回事??  请高手指教

解决方案 »

  1.   

    HINSTANCE g_hInstance = NULL; 
    HHOOK  g_hHook = NULL;
    这个要放在共享段里.
    {
    #pragma data_seg(".share")
    HINSTANCE g_hInstance = NULL; 
    HHOOK  g_hHook = NULL;
    #pragma data_seg(".share")
    #pragma comment (linker, "/section:.share, rws")
    }是因为在其它进程中没有成功安装而己.
      

  2.   

    改了,但还是只对自己窗口起作用。
    麻烦谁能发个简单全局钩子的 demo 源码给我,内容包括安装和卸载钩子的导出函数,能被其他编程语言调用(如C#)就行了十分感谢
      

  3.   

    HINSTANCE g_hInstance = NULL; 
    HHOOK  g_hHook = NULL;上面两个全局变量定义改成下面这样:
    #pragma data_seg("mydata")
    //这里的数据必须初始化,否则需使用bss_seg
    HINSTANCE g_hInstance = NULL; 
    HHOOK  g_hHook = NULL;
    #pragma data_seg()
    #pragma comment (linker, "/section:mydata, rws")
      

  4.   

    另外,先用VC测试你的DLL,实在不行还可以检查一下你的程序中是有将数据段pop出去的地方.