我想设置跟踪哪个应用程序处于活动状态的全局钩子。
在我的主程序中,我正在进行以下操作:
HMODULE mod=::GetModuleHandle(L"HookProcDll");
HHOOK rslt=(WH_CALLWNDPROCRET,MyCallWndRetProc,mod,0);
名为MyCallWndRetProc
的钩子过程存在于名为HookProcDll.dll的单独dll中。钩子程序正在观察WM_ACTIVATE
消息。
问题是代码卡在我设置钩子的行中,即在我调用::SetWindowsHookEx
的行中。然后Windows没有响应,我的任务栏消失了,我留下了空桌面。然后我必须重置计算机。
出了什么问题,为什么Windows无法响应?和 我是否需要在每个进程中注入HookProcDll.dll以设置全局钩子,我该怎么做?
答案 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实现。