VisualStudio工程中默认的Windows窗口取消息循环的写法如下:
while(GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAcclerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispathMessage(&msg);
}
}
这里
TranslateAcclerator执行失败才调用
TranslateMessage与DispathMessage,我的理解是
TranslateAcclerator在处理加速键时直接将处理后的消息发到窗口过程,如果调用成功(返回非零值),则不需要再调用
DispathMessage将消息发到窗口过程。正如百度百科中有写
“
若TransLateAccelerator返回非零值且消息已被翻译,应用程序就不能调用TranslateMessage函数对消息再做处理”。
因此
TranslateAcclerator调用失败,即返回零值则表示没有加速键消息被处理,或处理失败,此时才需要调用TranslateMessage进行消息处理和DispathMessage将消息发到窗口过程。