这是情况。我有两个不同的窗口挂钩,一个是 WH_SHELL 品种的全局挂钩,用于监视新的顶级窗口,第二个是 WH_CALLWNDPROC 的线程挂钩,它设置在第一个发现的一些顶级窗口上钩。这两个钩子在不同的 DLL 中实现。
据我所知,两个挂钩都安装正确。但是,我没有使用消息代码 > WM_USER将注册消息发布到挂钩窗口,而自定义 WH_CALLWNDPROC 挂钩从未处理过注册消息,但是“正常”的窗口消息正在传递,认为它很好。
挂钩已发现窗口的代码:
... Getting handle, mod, and procHook ...
DWORD threadId = GetWindowThreadProcessId(handle, NULL);
HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)procHook, mod, threadId);
if(!PostMessage(handle, CUSTOM_MESSAGE, NULL, NULL))
{
... fetch and print error message ...
}
钩子本身的主体:
... Report sends a message to an agreed upon window with the passed wParam & lParam
Report(20, nCode);
if(nCode == CUSTOM_MESSAGE)
{
... This code is never reached ...
Report(50, ERROR_SUCCESS);
if(PerformTask())
Report(200, ERROR_SUCCESS);
else
Report(400, ERROR_SUCCESS);
}
... More code handling more messages in the same basic form
第一个报告调用是确认钩子已安装并正在工作,因为它在十几岁和二十几岁时发回了一堆消息(ERASEBACKGROUND、PAINT 等)。
CUSTOM_MESSAGE 定义为 WM_USER + 314。用于 Report(...) 的消息是 WM_USER + 317。
我已经更新了我的代码以使用 RegisterWindowMessage 来获取要发送的 UINT,我使用 WM_USER 进行进程间通信是不正确的。
所以,基本上,我的设计或我对 Windows 挂钩和 PostMessage 的使用有什么问题?如果我遗漏了任何细节,请告诉我;涉及很多代码,这已经是一个相当大的问题,所以我试图只包括我认为相关的内容。
顺便说一句,是否有一致同意的更好的方法来调试钩子?我一直在通过将消息发布到商定的窗口并调试其 WndProc 来使用与 cout << ... 所有内容的道德等价物。
谢谢,
-凯文·蒙特罗斯