类向导生成的消息循环通常类似于
while( GetMessage() )
{
if( !TranslateAccelerator() )
{
TranslateMessage();
DispatchMessage();
}
}
而TranslateAccelerator文档说:
如果函数成功,则返回值为非零
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
在我的测试中,当TranslateAccelerator失败的唯一原因是没有找到此特定消息的加速器时,GetLastError返回0 == ERROR_SUCCESS。
我只是好奇,当TranslateAccelerator由于某些其他原因而失败时,是否存在任何现实条件,并且该消息应该不被翻译&分派?
提前致谢!
答案 0 :(得分:1)
是。该消息可以通过其他消息过滤API,例如IsDialogMessage()
。
来自MSDN:
因为 IsDialogMessage 函数执行所有必要的消息转换和分派,所以 IsDialogMessage 处理的消息不得传递给TranslateMessage或DispatchMessage函数。
答案 1 :(得分:1)
无论TranslateMessage可能失败的各种原因......它根本不暗示(当然也没有明确说明)消息不应该仍然传递给DispatchMessage。
提供的代码示例的真正问题是,除了0之外,GetMessage还可以返回错误代码-1。 -1表示您不应该处理消息(因为没有消息 - MSG结构很可能保持未初始化或可能具有先前消息的数据)。除非你可以做一些事情来“修复”破坏的条件,否则如果GetMessage在后续调用中返回-1,则返回-1 - (可能)正确的策略是退出消息循环。
此外,未初始化的MSG结构肯定是TranslateMessage和/或DispatchMessage失败的可能原因。