-1

这是情况。我有两个不同的窗口挂钩,一个是 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 << ... 所有内容的道德等价物。

谢谢,
-凯文·蒙特罗斯

4

2 回答 2

2

虽然@Michael 关于消息的使用是正确的WM_USER(它们应该只在应用程序中使用 -注册消息是更好的方式),同时我认为你没有收到它们的原因是由于钩子的性质CallWndProc和张贴的消息。我不是很肯定,但我认为你想GetMessage钩住已发布消息的钩子。

另一种选择是挂钩Debug钩子,它在所有其他钩子之前接收所有消息。您可以让该手表查看您的自定义消息,然后从那里确定哪个钩子(如果有)接收到您的自定义消息。

编辑:对于调试挂钩,只需附加到有问题的进程,并在挂钩过程中设置断点。这最终是我发现调试它们的最简单方法。

于 2009-04-03T23:23:08.877 回答
0

我想我想通了。没有完全吸收文档的简单案例。

我的 CallWndProc 钩子表现得好像 nCode、wParam 和 lParam 是传递给钩子线程 WndProc 的内容。事实上,lParam 包含一个指向 CWPSTRUCT 的指针。从该结构中读取数据,一切正常。

于 2009-04-04T03:47:06.497 回答