是否可以在不对窗口进行子类化的情况下挂钩特定的Windows消息。
有WH_GETMESSAGE但似乎会产生性能问题。
除此之外的任何其他解决方案都不会降低性能?
答案 0 :(得分:3)
AFAIK没有比你提到的更好的解决方案。当然,子类化窗口比挂钩线程的所有消息更好。
让我们考虑一下消息在窗口处理之前传递的路径:
PostMessage
/ SendMessage
或隐式执行操作系统,将消息发布或发送到窗口。GetMessage
或类似内容),然后调用DispatchMessage
。CallWindowProc
(或类似的)来调用窗口的过程。CallWindowProc
标识与窗口关联的窗口过程(通过GetClassLong
/ GetWindowLong
)子类化 - 表示替换目标窗口的窗口过程。这似乎是最好的变种。
使用WH_GETMESSAGE
标志安装挂钩将监视发布到消息队列的所有消息。由于以下原因,这很糟糕:
DispatchMessage
)。因此,子类化看起来好多了。
还有一个解决方案 - 如果您的特定邮件已发布(而不是已发送),您可以覆盖邮件循环,并且对于每个检索到的邮件,您可以执行一些前/后处理