Raymond Chen 2006年04月25日
不,实际上,您需要将所有未处理的消息传递给 DefWindowProc
在之前的讨论中,我提到了在拒绝设备移除请求时,需要返回一个特定的值。这是因为有些程序错误地认为它们已经处理了所有的Windows消息,对于未处理的消息,它们只是简单地返回零。
但实际上,随着时间的推移,Windows系统增加了许多新的消息类型,这些消息在默认窗口处理函数DefWindowProc
中都有相应的处理逻辑。 然而,我经常发现有些程序仍然存在这样的误解,它们认为微软不会对窗口管理器进行改进,因此对于未处理的消息,这些程序还是简单地返回零。更糟糕的是,有些程序甚至没有处理所有已知的消息。
例如,有一个程序的辅助窗口只处理少数几种消息,而对其他消息则一律返回零。这导致了一些严重的问题,比如你无法正常关闭计算机,因为返回零会阻止关机过程。
此外,如果你的程序焦点在这个辅助窗口上,一些自定义的键盘快捷操作(比如音量控制)也会失效,因为它没有将相关的消息传递给DefWindowProc
来处理。
所以,我想再次强调:如果你的窗口程序中有消息没有被处理,请务必将其传递给
DefWindowProc
。
这样做可以确保你的程序能够正常响应所有可能的Windows消息,从而避免上述问题。你的用户会因为你的这一小小改进而感激你的。 对于那些可能误解我意思的人,我补充一点:如果你使用的是某个特定的编程框架,那么请遵循该框架的规则来处理未处理的消息。例如,在对话框程序中,你不需要将未处理的消息传递给DefWindowProc
,你只需要返回FALSE
,框架就会自动进行默认的处理。