1

类向导生成的消息循环通常看起来像

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

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

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

我只是好奇,当 TranslateAccelerator 因其他原因失败,消息不应该被翻译和发送时,是否有任何现实条​​件

提前致谢!

4

2 回答 2

2

是的。消息可能会通过其他一些消息过滤 API,例如IsDialogMessage().

来自 MSDN:

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

于 2009-10-30T21:07:01.957 回答
1

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

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

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

于 2009-11-02T12:28:38.547 回答