请将所有未处理的消息传递给 DefWindowProc

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

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

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

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

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

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

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

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

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

总结

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

否则,各种意外会发生。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2010-08-02 16:59:54

2022-07-04 09:17:37

Flask开源

2020-04-08 18:29:20

Vue组件属性

2009-12-25 10:01:23

WinForm程序

2022-05-31 10:38:50

Linux密码scp

2020-05-11 17:35:57

vue开发组件

2009-08-27 10:01:27

ibmdw云计算

2022-01-06 20:00:39

数据企业安全

2014-03-04 15:28:32

iOS开发消息传递机制

2009-06-14 17:18:55

ibmdwWebSphereMQ

2024-04-03 11:36:09

KafkaRabbitMQ架构

2023-03-21 15:30:54

微服务通信架构

2009-12-21 15:12:40

WCF操作Stream

2023-05-17 08:16:04

RabbitMQ消息传递

2009-08-19 15:54:33

处理C#消息

2009-06-17 16:56:46

Spring JMS

2012-02-06 09:48:55

红帽功能

2023-03-27 15:39:53

微服务架构REST

2010-01-26 10:38:56

Android消息传递

2011-09-07 16:57:31

QT WidgetQWidget
点赞
收藏

51CTO技术栈公众号