【问题标题】:How can I determine whether a message type is sent or posted?如何确定消息类型是已发送还是已发布?
【发布时间】:2009-05-10 07:55:38
【问题描述】:

我知道某些消息类型直接发送到窗口过程,而其他消息类型则发布到线程的消息队列,但我还没有找到任何方法来确定是否发送或发布消息。

MSDN 有一半的帮助;它解释了what's going on,但它给出的例子可能并不详尽。

是否有明确的已发送消息与已发布消息的列表,或者是否有确定消息类型的方法?

【问题讨论】:

    标签: windows winapi capture messages


    【解决方案1】:

    使用InSendMessageInSendMessageExdetermine if you are processing a message that was sent by a callSendMessage 函数。

    【讨论】:

    • 这似乎不适用于从同一线程发送的消息。
    • 我是从钩子过程的角度来处理这个问题的,所以我需要在编译时知道是在 WH_GETMESSAGE 还是 WH_CALLWNDPROC 钩子中处理消息。
    【解决方案2】:

    有些消息既不张贴也不发送。 WM_PAINT、WM_TIMER 和其他一些情况就是如此。当发布消息的队列为空时,GetMessage 会简单地返回它们。

    我不确定你想挂什么应用程序,但如果你不得不问这样的问题,那我/我有点害怕。对于开发人员来说,没有什么比花时间在用户报告的崩溃上更令人沮丧的了,只是发现原因是来自其他注入行为不端代码的应用程序。小心行事!

    此外,Spy++(Visual Studio 附带的工具)将显示任何给定的实时 Windows 应用程序发布/发送/接收了哪些消息。

    【讨论】:

      【解决方案3】:

      记录每条消息的 MSDN 页面应被视为此消息的权威来源:

      The WM_LBUTTONDOWN message is posted when ...

      The WM_SETFOCUS message is sent to a window after ...

      等等

      【讨论】:

      • 这适用于 MSDN 明确的消息,但有类似 msdn.microsoft.com/en-us/library/ms646360.aspx 的页面:“一个窗口收到此消息...”
      • @Steve:请记住,有些消息有时或总是在没有显式调用 Send 或 PostMessage() 的情况下传递给您的程序。 WM_SYSCOMMAND 似乎总是由默认窗口处理程序在内部为其他消息(非客户端鼠标、键盘)生成的。您可能仍然可以使用 WH_CALLWNDPROC 挂钩捕获它,因为这是幕后发生的事情(直接调用窗口过程,来自默认窗口过程) - 试试看。
      猜你喜欢
      • 2017-08-12
      • 2023-03-20
      • 2016-01-12
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2019-01-07
      • 2020-10-24
      相关资源
      最近更新 更多