我见过的大多数Win32主循环都是这样的结构:
while (GetMessage(&message, NULL, 0, 0) > 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
Run Code Online (Sandbox Code Playgroud)
有人指出,MsgWaitForMultipleObjects
可以用来为主循环添加一些变化.但有地方之间做一些场景GetMessage
,TranslateMessage
和DispatchMessage
实际上是有用的?
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的虚拟方法公开它,这是一个可以被覆盖的虚函数,因此您的程序可以实现自己的快捷方式等等.
他们是不同的野兽.
将虚拟密钥消息转换为字符消息.字符消息被发布到调用线程的消息队列,以便在线程下次调用GetMessage或PeekMessage函数时读取.[...] TranslateMessage函数不会修改lpMsg参数指向的消息.
DispatchMessage函数,在另一方面,将调度消息到窗口过程.
DispatchMessage
处理消息的实际工作也是如此.TranslateMessage
可能或可能不会向线程队列发布新消息.如果消息被翻译,则将字符消息发布到线程的消息队列中.
TranslateMessage函数不会修改lpMsg参数指向的消息.
它们是单独的调用,因此程序员可以有机会避免提供的消息转换TranslateMessage
.