5

这是关于 Windows 编程的一个普遍问题:

窗口消息“可靠”吗?

例如(这些只是示例

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

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

  • 如果你的窗口失去焦点,你能确定你会收到一条消息吗?WM_KILLFOCUS

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


例子:

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

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

笔记:

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

4

1 回答 1

3

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

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

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

于 2011-05-24T17:46:18.317 回答