dll项目里是这样的:
#pragma data_seg(".shareddata")
HHOOK  hbHook=NULL;
HMODULE hmodDll = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.shareddata,RWS")
BOOL APIENTRY DllMain(HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH) 

if(hmodDll == NULL)
   hmodDll = (HMODULE)hModule;//DLL实例句柄 
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)

UnHook();

return TRUE;
}BOOL WINAPI installhook()
{
    hbHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hmodDll,0);
    return TRUE;
}
LRESULT WINAPI CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    if(nCode<0)
  return CallNextHookEx(hHook, nCode, wParam, lParam);
switch(nCode)
{
case HCBT_CREATEWND:

                  //窗口建立时拦截
                  //MessageBox(NULL,TEXT("KAO"),TEXT("KAO"),MB_OK);
break;
}
LRESULT RetVal = CallNextHookEx(hbHook, nCode, wParam, lParam );
return  RetVal;
}
BOOL __declspec(dllexport)  UnHook()
{   
BOOL unhooked = UnhookWindowsHookEx(hHook);
return unhooked;
}进程窗体里我在WM_CREATE里调用DLL
case WM_CREATE:
    static HINSTANCE hinstDLL; 
    typedef BOOL (CALLBACK *inshook)(); 
    inshook instkbhook;
if(hinstDLL=LoadLibrary((LPCTSTR)"d:\\code\\c\\hook\\debug\\hook.dll"))
    {
       instkbhook=(inshook)GetProcAddress(hinstDLL, "installhook"); 
       instkbhook();
    }
    break;
现在我可以拦截到调用进程窗体的消息事件,但是别的进程一点反应都没有,调了半天了,没有头绪了。

解决方案 »

  1.   

    SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hmodDll,0);最后一个参数是目标进程的ID,如果使用0,就是所有进程。
      

  2.   

    我就是要HOOK所有进程的啊,我设置0没有错啊
      

  3.   

    全局钩子相当于在所有进程都注入了你的DLL,因此DLL_PROCESS_ATTACH,DLL_PROCESS_DETACH多次,倒底钩子是否成功安装都未知。InstallHook/UninstallHook应该写成专门的函数,并且全局钩子函数应该写在DLL中,LoadLibrary->InstallHook->UninstallHook->FreeLibrary
      

  4.   

    全局钩的安装、删除不应该写在DllMain中。
      

  5.   

    全局钩的安装、删除不应该写在DllMain中。??
    我看网上的例子是这么写的,那该写在哪里呢。问题是我使用WH_Keyborad的时候这样写是可以勾到所有的事件的,不知道为什么换了这个就不行了
      

  6.   

    靠!我也是这个问题.
    钩子的Dll和你写的类似,只能用在currentThread中,如果SetWindowsHookEx最后一个参数为0,则钩子不能成功安装,只能为GetCurrentThreadId()
    你在哪看到的例子?能不能发给我看看?
      

  7.   

    全局钩的安装、删除不应该写在DllMain中
    UnHook()什么的函数在安装hook的程序里调用...
      

  8.   

    不知道lz怎么调试的?如果是直接运行你的exe程序进行调试,那当然是不能拦截到别的进程里的消息了。只有在你的进程里的消息才会被拦截到。你可以在钩子函数里写log文件,这样就能确定是不是拦截到别的进程里的消息了
      

  9.   

    在DLL的程序里调试啊,直接设断点,我开始做了个键盘钩子是可以拦截所有进程的,但是WH_CBT却拦截不到相关的事件,如窗口创建之类的啊。这么多天了,还是不知道如何解决,有谁做过的给个音吧。