请将所有未处理的消息传递给 DefWindowProc
创始人
2025-06-27 17:10:14
0

在之前的一篇文章中,我曾提到:如果你希望拒绝一次设备移除查询请求,则需要返回一个特殊的 BROADCAST_QUERY_DENY 值,因为太多的程序开发者认为,他们已经覆盖了所有 Windows 消息的处理了,对于其他的消息,直接返回 0 就可以了。

从那时候开始,操作系统引入了很多新的消息,这些消息中的很大一部分都是在 DefWindowProc 中进行了默认的处理。
时不时的,我会碰到一些应用程序会这样假设:微软应该从来不会优化窗口管理器组件吧?对于那些我不需要处理的消息,我直接返回 0 就可以了,问题不大。

其实,这些应用程序甚至都没有处理所有现有的旧消息!

我们看一个例子,在一个应用程序中,它有一个帮助窗口,这个窗口会处理一些它感兴趣的消息,然后对于所有其他消息,它直接返回了 0。结果就是:用户连关机都关不了,因为应用程序对系统发出的广播消息 WM_QUERYENDSESSION 返回了一个 0,这意味着,应用程序对操作系统说:”等等,请不要关机”。

我猜这个应用程序的开发者会意味用户会在关机前先手动关闭他的应用程序吧。

另外,自定义键盘按钮(如音量控制按钮)也不起作用(如果焦点在此帮助程序窗口上),因为它忽略了将 WM_APPCOMMAND 消息传递给 DefWindowProc 函数。

因此,我再次恳求你:如果你不处理窗口过程中的消息,请将其传递给 DefWindowProc 函数。你的用户真的会谢。

另外有个小细节需要注意:如果你使用的是框架窗口,请遵循该框架的协议来指示你希望进行默认消息处理。例如,对话框过程不会将未经处理的消息传递给 DefWindowProc 函数。它们仅返回 FALSE 以指示应进行默认处理。

总结

我想这里作者的原则很简单:对于你不想处理的消息,不要处理并简单返回 0,而是交给系统默认处理函数 DefWindowProc。

否则,各种意外会发生。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...