TranslateAccelerator return value
由类向导生成的消息循环通常看起来像
1 2 3 4 5 6 7 8 | while( GetMessage() ) { if( !TranslateAccelerator() ) { TranslateMessage(); DispatchMessage(); } } |
而TranslateAccelerator文档说:
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用GetLastError。
在我的测试中,当TranslateAccelerator失败的唯一原因是找不到此特定消息的加速器时,GetLastError返回0 == ERROR_SUCCESS。
我只是很好奇,当TranslateAccelerator由于其他原因而失败时,是否存在任何现实情况,并且不应该翻译和分发消息?
提前致谢!
无论TranslateMessage可能失败的各种原因是什么……完全没有暗示(当然也没有明确声明)该消息仍不应传递给DispatchMessage。
提供的代码示例的真正问题在于,除0外,GetMessage还可返回错误代码-1。 -1表示您不应处理该消息(因为没有消息-MSG结构很可能未初始化或可能具有先前消息的数据)。除非您可以采取某些措施来"修复"破损的条件,否则如果GetMessage返回-1,则它可能在后续调用中返回-1-(可能)正确的策略是退出消息循环。
同样,未初始化的MSG结构肯定是TranslateMessage和/或DispatchMessage失败的可能原因。
是。该消息可能会通过其他一些消息过滤API,例如
从MSDN:
因为IsDialogMessage函数执行所有必需的消息翻译和分派,所以不能将IsDialogMessage处理的消息传递给TranslateMessage或DispatchMessage函数。