【问题标题】:Why are "TranslateMessage" and "DispatchMessage" separate calls?为什么“TranslateMessage”和“DispatchMessage”是分开调用的?
【发布时间】:2011-03-10 06:47:44
【问题描述】:

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

while (GetMessage(&message, NULL, 0, 0) > 0) {
  TranslateMessage(&message);
  DispatchMessage(&message);
}

有人向我指出MsgWaitForMultipleObjects 可用于向主循环添加一些变化。但是在GetMessageTranslateMessageDispatchMessage 之间做点什么真的有用吗?

【问题讨论】:

    标签: winapi


    【解决方案1】:

    他们是不同的野兽。

    对于TranslateMessage function

    将虚拟键消息翻译成 字符消息。性格 消息发布到呼叫 线程的消息队列,被读取 下次线程调用 GetMessage 或 PeekMessage 函数。 [...] TranslateMessage 函数不 修改指向的消息 lpMsg 参数。

    另一方面,DispatchMessage 向窗口过程发送消息。

    所以DispatchMessage 执行处理消息的实际工作。 TranslateMessage 可以或不可以将新消息发布到线程队列。如果消息被翻译,则将字符消息发布到线程的消息队列中。

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

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

    【讨论】:

    • 消息翻译完成后,虚拟键消息还会被DispatchMessage调度吗?
    • @JeroenBollen 是的,因为TranslateMessage 将翻译结果推送到消息队列中,而不是修改您传递给它的消息。因此,翻译版本和虚拟键原件都被发送。
    【解决方案2】:

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

    while (GetMessage(&msg, 0, 0, 0)) 
    {
        if (!TranslateAccelerator(hwndMain, haccel, &msg))
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
    }
    

    这是一个相当大的提示,告诉你在发送消息之前你想要做什么:在窗口看到之前捕获应该被拦截和特殊处理的消息。键盘快捷键是一个经典的例子,无论哪个窗口有焦点,都需要检测它们。

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

    【讨论】:

    • 是否可以多次翻译和发送一条消息,或者根本不翻译和发送消息? - 我已经测试过,没有问题,但我只是想确保它真的没有问题。
    【解决方案3】:

    引用MSDN的一个例子:

    您可以通过多种方式修改消息循环。例如,您可以从队列中检索消息而不将它们分派到窗口。这对于发布未指定窗口的消息的应用程序很有用。您还可以指示 GetMessage 搜索特定消息,将其他消息留在队列中。如果您必须暂时绕过消息队列的通常 FIFO 顺序,这很有用。

    如果您不需要转换键盘输入控制代码,您也可以避免调用 Translate 消息。

    【讨论】:

      【解决方案4】:

      TranslateMessage() 将虚拟键消息转换为字符输入消息。

      在某些情况下,您希望为某些虚拟键生成字符输入消息,这是对远程机会的单独调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        相关资源
        最近更新 更多