|对话框管理器第六章:消息循环中的细节

文章图片
在上一篇文章中 , 我留下了一道课后作业:找到EndManualModalDialog和模态对话框消息循环之间的细微Bug 。
微妙之处在于:EndManualModalDialog会在内部设置了一些标志 , 但没有强制消息循环注意到该标志已实际设置 。 回想一下 , GetMessage函数在投递性消息(Posted Message)到达消息队列之前不会返回 。如果传入的已发送消息到达 , 则将它们传递到相应的窗口过程 , 但GetMessage函数不返回 。它只是不断传递传入的已发送消息 , 直到投递性消息最终到达 。
因此 , Bug是:当你调用EndManualModalDialog时 , 它会设置指示模式消息循环停止运行的标志 , 但不会做任何事情来确保模式消息循环会检测这个标志 。在发布的消息到达之前什么都不会发生 , 这会导致GetMessage返回 。发送消息并重新启动while循环 , 此时代码最终注意到fEnded标志已设置并跳出模式消息循环 。
有几种方法可以解决这个问题 。 比较快速的方法是:发布一条毫无意义的消息 , 如下图所示:
这将强制GetMessage返回 , 因为我们确保队列中至少有一条消息等待处理 。我们选择了 WM_NULL消息 , 因为它什么都不做 。我们对消息的作用不感兴趣 , 只对消息存在的事实感兴趣 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《The dialog manager part 6: Subtleties in message loops》
【|对话框管理器第六章:消息循环中的细节】
- 科技引领未来 创新助力可持续发展 第六届联合国工业发展组织全球科技创新大会在沪举行
- 三星|画江湖之不良人:第六季二审通过!官方回应上映时间需腾讯决定!
- vivo|11月次旗舰手机性能排行榜:vivo S15 Pro排名第六!
- win10系统打开运行对话框的快捷键方法
- 在Build22543中|微软重新设计windows11任务管理器预览版本
- 电脑里的设备管理器通常是管理着电脑硬件设备的一个系统自带的工具|电脑设备管理器在哪里打开?
- Win10系统上我们都知道有自带的一个文件资源管理器|win10系统文件管理器无响应如何解决
- 苏州好消息汇总:京东研发总部落户,竞争力全国第六,入选首批国家更新城市
- |文件资源管理器无法打开怎么办?
- 11月22日消息|微软win11学院:如何移除文件管理器右键菜单
