关于Windows:TranslateAccelerator返回值

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,例如IsDialogMessage()

从MSDN:

因为IsDialogMessage函数执行所有必需的消息翻译和分派,所以不能将IsDialogMessage处理的消息传递给TranslateMessage或DispatchMessage函数。