TranslateAccelerator返回值

时间:2009-10-30 20:35:14

标签: windows user-interface winapi user32

类向导生成的消息循环通常类似于

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

而TranslateAccelerator文档说:
如果函数成功,则返回值为非零 如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。

在我的测试中,当TranslateAccelerator失败的唯一原因是没有找到此特定消息的加速器时,GetLastError返回0 == ERROR_SUCCESS。

我只是好奇,当TranslateAccelerator由于某些其他原因而失败时,是否存在任何现实条​​件,并且该消息应该被翻译&分派?

提前致谢!

2 个答案:

答案 0 :(得分:1)

是。该消息可以通过其他消息过滤API,例如IsDialogMessage()

来自MSDN:

因为 IsDialogMessage 函数执行所有必要的消息转换和分派,所以 IsDialogMessage 处理的消息不得传递给TranslateMessage或DispatchMessage函数。

答案 1 :(得分:1)

无论TranslateMessage可能失败的各种原因......它根本不暗示(当然也没有明确说明)消息不应该仍然传递给DispatchMessage。

提供的代码示例的真正问题是,除了0之外,GetMessage还可以返回错误代码-1。 -1表示您不应该处理消息(因为没有消息 - MSG结构很可能保持未初始化或可能具有先前消息的数据)。除非你可以做一些事情来“修复”破坏的条件,否则如果GetMessage在后续调用中返回-1,则返回-1 - (可能)正确的策略是退出消息循环。

此外,未初始化的MSG结构肯定是TranslateMessage和/或DispatchMessage失败的可能原因。