2009-10-30 107 views
1

由類嚮導生成的消息循環往往看起來像TranslateAccelerator返回值

while(GetMessage()) 
{ 
    if(!TranslateAccelerator()) 
    { 
     TranslateMessage(); 
     DispatchMessage(); 
    } 
} 

而TranslateAccelerator文件說:
如果函數成功,返回值是非零。
如果函數失敗,返回值爲零。要獲得擴展的錯誤信息,請調用GetLastError。

在我的測試中,當TranslateAccelerator失敗的唯一原因是沒有找到這個特定消息的加速器,GetLastError返回0 == ERROR_SUCCESS。

我只是好奇,有沒有現實條件時TranslateAccelerator失敗,因爲其他一些原因,消息應該翻譯&出動?

在此先感謝!

回答

1

是的。該消息可能會通過其他一些消息過濾API,如IsDialogMessage()

從MSDN:

由於的IsDialogMessage功能執行所有必要的平移和消息的調度,通過的IsDialogMessage處理不能被傳遞到的TranslateMessage或DispatchMessage函數功能的消息。

1

無論TranslateMessage可能失敗的各種原因是什麼......以及它完全沒有暗示(當然沒有明確說明)該消息不應該仍然傳遞給DispatchMessage。

提供的代碼示例的實際問題是,除了0之外,GetMessage可以返回-1的錯誤代碼。 -1意味着你不應該處理消息(因爲沒有消息 - MSG結構最有可能是未初始化的,或者可能有先前消息的數據)。除非您可以採取措施來「修復」已損壞的條件,否則,如果GetMessage在後續調用中返回-1,則返回-1 - (可能)正確的策略是退出消息循環。

此外,未初始化的MSG結構當然可能是TranslateMessage和/或DispatchMessage失敗的可能原因。