2010-05-27 801 views
3

我想设置跟踪哪个应用程序处于活动状态的全局钩子。如何为WH_CALLWNDPROCRET设置全局钩子?

在我的主程序我做foloowing:

HMODULE mod=::GetModuleHandle(L"HookProcDll"); 
HHOOK rslt=(WH_CALLWNDPROCRET,MyCallWndRetProc,mod,0); 

被称为MyCallWndRetProc存在于所谓的HookProcDll.dll单独的DLL的钩子程序。挂钩程序正在观察WM_ACTIVATE消息。

问题是,代码在我设置挂钩的行中出现问题,即在我拨打电话::SetWindowsHookEx的行中。然后Windows得到反应迟钝,我的任务栏消失,我留下了空的桌面。然后我必须重置电脑。

错在哪里,为什么Windows得不到响应?和 我是否需要在每个进程中注入HookProcDll.dll以设置全局钩子,我该怎么做?

+0

我想你在第二行缺少一个函数名称。而且你没有发布最重要的代码:'SetWindowsHookEx'调用和你的钩子程序。 – interjay 2010-05-27 22:32:15

+0

我假设HHOOK rslt =(..)应该是HHOOK rslt = SetWindowsHookEx(...); – Michael 2010-05-27 22:38:09

+1

您已经在每个进程中注入DLL。这是问题所在,你会崩溃每个GUI应用程序,包括Windows资源管理器。将其注入到自己的第一个中,以便调试它。 – 2010-05-27 22:51:53

回答

1

这几乎肯定听起来像是MyCallWndRetProc中的崩溃错误。你指定你的钩子DLL在每一个窗口进程中被加载,当窗口消息之后调用MyCallWndRetProc时它会崩溃。由于它在每个进程中的每个窗口消息之后都被调用,它最终会在用户会话中取消显示UI的每个进程。你甚至不能启动新的应用程序,因为你的钩子程序会立即加载到它们中。

将代码包含到MyCallWndRetProc中,也许您的DllMain也应该让我们对发生的事情有所了解。

0

这是我的钩子程序的代码,并保存在HookProcDll.dll

#include "HookProcDll.h" 
LRESULT CALLBACK MyCallWndRetProc(
    __in int nCode, 
    __in WPARAM wParam, /* whether the msg is sent by the current process */ 
    __in LPARAM lParam /* pointer to CWPRETSTRUCT , which specifies details about the message */ 
) 
{ 
    if(nCode >=0) 
    { 
     CWPRETSTRUCT* retStruct=(CWPRETSTRUCT*)lParam; 
     if(retStruct->message == WM_ACTIVATE) 
     { 

     } 
    } 
    return ::CallNextHookEx(0,nCode,wParam,lParam); 
} 

我HookProcDll.dll没有明确的DllMain函数.The HookProcDll.dll与Visual Studio的DLL项目取得所以我想它包括DllMain的standrad实现。