請將所有未處理的消息傳遞給 DefWindowProc
在之前的一篇文章中,我曾提到:如果你希望拒絕一次設備移除查詢請求,則需要返回一個特殊的 BROADCAST_QUERY_DENY 值,因為太多的程序開發者認為,他們已經覆蓋了所有 Windows 消息的處理了,對于其他的消息,直接返回 0 就可以了。
從那時候開始,操作系統引入了很多新的消息,這些消息中的很大一部分都是在 DefWindowProc 中進行了默認的處理。
時不時的,我會碰到一些應用程序會這樣假設:微軟應該從來不會優化窗口管理器組件吧?對于那些我不需要處理的消息,我直接返回 0 就可以了,問題不大。
其實,這些應用程序甚至都沒有處理所有現有的舊消息!
我們看一個例子,在一個應用程序中,它有一個幫助窗口,這個窗口會處理一些它感興趣的消息,然后對于所有其他消息,它直接返回了 0。結果就是:用戶連關機都關不了,因為應用程序對系統發出的廣播消息 WM_QUERYENDSESSION 返回了一個 0,這意味著,應用程序對操作系統說:”等等,請不要關機”。
我猜這個應用程序的開發者會意味用戶會在關機前先手動關閉他的應用程序吧。
另外,自定義鍵盤按鈕(如音量控制按鈕)也不起作用(如果焦點在此幫助程序窗口上),因為它忽略了將 WM_APPCOMMAND 消息傳遞給 DefWindowProc 函數。
因此,我再次懇求你:如果你不處理窗口過程中的消息,請將其傳遞給 DefWindowProc 函數。你的用戶真的會謝。
另外有個小細節需要注意:如果你使用的是框架窗口,請遵循該框架的協議來指示你希望進行默認消息處理。例如,對話框過程不會將未經處理的消息傳遞給 DefWindowProc 函數。它們僅返回 FALSE 以指示應進行默認處理。
總結
我想這里作者的原則很簡單:對于你不想處理的消息,不要處理并簡單返回 0,而是交給系統默認處理函數 DefWindowProc。
否則,各種意外會發生。