【问题标题】:Are Window Messages "Reliable"?窗口消息“可靠”吗?
【发布时间】:2011-05-24 17:36:38
【问题描述】:

这是一个关于 Windows 编程的一般性问题:

Window 消息“可靠”吗?

对于例子(这些只是例子):

  • 您能确定WM_MOUSEMOVE 会在光标进入您的屏幕之前发生吗?

  • 您能否确定如果插入设备,您将收到WM_DEVICECHANGE 消息?

  • 如果您的窗口失去焦点,您能否确定收到WM_KILLFOCUS 消息?

或者,换句话说:您能否确定您会在适当的时间收到适当的消息,或者您是否总是必须进行防御性编码以防万一,不知何故,您可能会因为没有明显记录的原因而错过一条消息?


示例:

  • 保证 (AFAIK) 文件系统过滤器驱动程序不会“错过”文件操作或更改通知。

  • 相比之下,保证ReadDirectoryChangesW 不会错过通知。事实上,如果它的缓冲区溢出,它可能会错过很多。

注意:

不是谈论针对对手的情况(例如,有人劫持了您的窗口程序或安装了钩子/过滤器);这几乎会使任何保证无效。我只是在询问即使没有人故意表示任何不好的事情也可能真正发生的晦涩情况,例如某些随机缓冲区溢出,如果有人使用SendInput等,假设您可以控制自己的代码。

【问题讨论】:

  • 这不是“可靠”的意思。 “可靠”意味着您可以确定消息已成功传递或向发件人报告了错误,消息不会无声地丢失。
  • 一般来说,你不能。对于特定消息,是的,您可以。
  • @Ben:这不是 所说的“可靠”。 ;) 我会举一个例子来说明我的观点。
  • 窗口消息队列也有最大长度(来自the docs:“每个消息队列有10,000 条发布消息的限制。”),如果队列已满,PostMessage 可能会失败。

标签: windows winapi window-messages


【解决方案1】:

不,您不能确定给定消息将按特定顺序传递。以下是为什么不这样做的几个原因

  • 消息可以以程序方式发送,这可以用来模拟“不可能”的场景,例如WM_KEYUP 后跟WM_KEYDOWN
  • 另一个例程可以对您的窗口进行子分类并选择性地拦截消息而不将它们发送到您的WNDPROC

最好在排序很重要的任何场景中进行防御性编码

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多