2010-05-06 78 views

回答

3

AFAIK没有比您提到的更好的解决方案。当然,子类化窗口比钩住线程的所有消息要好。

我们认为,直到它通过窗口处理的消息通过了哪条路径:

  1. 消息或者由OS张贴或发送到窗口,无论是通过显式调用PostMessage/SendMessage或暗示。
  2. 只发布消息:最终线程从消息队列中弹出此消息(通过调用GetMessage或类似的方法),然后调用DispatchMessage
  3. 操作系统调用窗口的过程,调用CallWindowProc(或类似的)。
  4. CallWindowProc标识与窗口相关联的窗口procedore(经由GetClassLong/GetWindowLong
  5. 上述程序被调用。

子类化 - 意味着替换目标窗口的窗口过程。这似乎是最好的变体。 使用WH_GETMESSAGE标志安装挂钩将监视发布到消息队列的所有消息。这是不好的,因为以下原因:

  1. 性能原因。
  2. 你会得到通知只在特定线程
  3. 你会得到发布的消息仅通知(发送的邮件将不可见)
  4. A“发布”的消息并不一定意味着“创建的窗口交付”。也就是说,它可能会被消息循环过滤掉(不需要调用DispatchMessage)。
  5. 你不能看到实际的窗口做了什么,并返回该消息。

因此,子类似乎好多了。

还有一个解决办法 - 如果您的具体消息发布(而不是发送),你可以重写消息循环,并为每一个检索到的消息,你可能会做一些前/后处理

相关问题