为什么"TranslateMessage"和"DispatchMessage"会分开调用?

Sté*_*hen 22 winapi

我见过的大多数Win32主循环都是这样的结构:

while (GetMessage(&message, NULL, 0, 0) > 0) {
  TranslateMessage(&message);
  DispatchMessage(&message);
}
Run Code Online (Sandbox Code Playgroud)

有人指出,MsgWaitForMultipleObjects可以用来为主循环添加一些变化.但有地方之间做一些场景GetMessage,TranslateMessageDispatchMessage实际上是有用的?

Han*_*ant 18

更传统的消息循环如下所示:

while (GetMessage(&msg, 0, 0, 0)) 
{
    if (!TranslateAccelerator(hwndMain, haccel, &msg))
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

在发送消息之前,这是你想要做的事情的一个非常大的提示:捕获应该在窗口看到它们之前特别拦截和处理的消息.键盘快捷键是一个典型的例子,无论哪个窗口都有焦点,都需要检测它们.

任何GUI类库都使用名为App.PreProcessMessage的虚拟方法公开它,这是一个可以被覆盖的虚函数,因此您的程序可以实现自己的快捷方式等等.


Jor*_*ira 9

他们是不同的野兽.

对于TranslateMessage函数

将虚拟密钥消息转换为字符消息.字符消息被发布到调用线程的消息队列,以便在线程下次调用GetMessage或PeekMessage函数时读取.[...] TranslateMessage函数不会修改lpMsg参数指向的消息.

DispatchMessage函数,在另一方面,将调度消息到窗口过程.

DispatchMessage处理消息的实际工作也是如此.TranslateMessage可能或可能不会向线程队列发布新消息.如果消息被翻译,则将字符消息发布到线程的消息队列中.

TranslateMessage函数不会修改lpMsg参数指向的消息.

它们是单独的调用,因此程序员可以有机会避免提供的消息转换TranslateMessage.