首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

过滤窗口消息的时候请谨慎

有两个API,大家一定十分熟悉:GetMessage和PeekMessage。

我们可以向它们传递一个过滤器,就可以限制函数将从消息队列中检索的窗口句柄或消息范围。

虽然可以使用这些过滤器,但请确保你最终要执行一次未过滤消息的调用,以便任何其他未处理的消息都可以得到妥善处理。

一个比较常见的错误是,在GetMessage消息循环中使用了一个基于窗口句柄的过滤器,例如之前我们的例子程序:

虽然在我们的例子程序中,我们只创建一个窗口,但是上面的代码仍然是不正确的。

有些人可能会问了,”这怎么可能呢?这个程序只创建了一个窗口,为什么还会有其他窗口的消息?虽然这里使用的过滤器看起来有点多余,但是并没有任何害处,不是吗?”

请别忘了。很多系统服务会在后台创建窗口。举个例子,如果启用了输入编辑器,则编辑器可会创建额外的窗口来辅助字符的输入。

如果你初始化COM库,则COM可能约会创建一个隐藏的窗口来辅助线程之间的封送。

另外一个例子,如果你只使用过滤的GetMessage,那么发往这些帮助窗口的消息将永远不会被处理,到时你就会摸不着头脑,想知道为什么程序在尝试执行拖放操作时偶尔会挂起。

本文的启示:确保你的消息循环最终执行未经过滤的消息处理,以便这些服务可以正常运行。

总结

要不是为了研究的目的,我想我已经很长时间没有触碰过消息循环了。

但如果你没有深入研究并理解消息循环和事件驱动,则在实现一些高级功能的时候,可能会无从下手,因为缺乏一些理论的支撑。

武林中各种流派,各种招式,但致胜之关键的是这些看不见,摸不着的所谓的内力。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《The dangers of filtering window messages》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220502A02ZEL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券