如何为WH_CALLWNDPROCRET设置全局钩子?

时间:2010-05-27 22:20:50

标签: c++ winapi hook

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

在我的主程序中,我正在进行以下操作:

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

名为MyCallWndRetProc的钩子过程存在于名为HookProcDll.dll的单独dll中。钩子程序正在观察WM_ACTIVATE消息。

问题是代码卡在我设置钩子的行中,即在我调用::SetWindowsHookEx的行中。然后Windows没有响应,我的任务栏消失了,我留下了空桌面。然后我必须重置计算机。

出了什么问题,为什么Windows无法响应?和 我是否需要在每个进程中注入HookProcDll.dll以设置全局钩子,我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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函数。HookProcDll.dll是使用visual studio dll项目制作的,所以我猜它包含了DllMain的standrad实现。