【问题标题】:How to set global hook for WH_CALLWNDPROCRET?如何为 WH_CALLWNDPROCRET 设置全局挂钩?
【发布时间】:2010-05-27 22:20:49
【问题描述】:

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

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

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

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

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

做错了什么,为什么 Windows 没有响应?和 我是否需要在每个进程中注入 HookProcDll.dll 才能设置全局挂钩,我该怎么做?

【问题讨论】:

  • 我认为您在第二行中缺少函数名称。而且你没有发布最重要的代码:SetWindowsHookEx 调用和你的钩子过程。
  • 我认为 HHOOK rslt=(..) 应该是 HHOOK rslt=SetWindowsHookEx(...);
  • 您已经在每个进程中注入了 DLL。这是问题所在,您正在使每个 GUI 应用程序崩溃,包括 Windows 资源管理器。先把它注入你自己的,这样你就可以调试它了。

标签: c++ winapi hook


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是我的钩子程序的代码,它存储在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 的标准实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多