【发布时间】: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