Почему являются “TranslateMessage” и “DispatchMessage” отдельными вызовами?

Большинство основных циклов Win32, которые я видел, все структурировано как:

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

На это указали мне это MsgWaitForMultipleObjects может использоваться для добавления некоторого разнообразия к основному циклу. Но есть ли сценарий где выполнение чего-то между GetMessage, TranslateMessage и DispatchMessage на самом деле полезно?

22
задан hippietrail 25 December 2012 в 11:20
поделиться

4 ответа

Более традиционный цикл сообщений выглядит так:

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

Это довольно большой намек на то, что вы хотите сделать перед отправкой сообщения: поймать сообщения, которые должны быть перехвачены и обработаны особым образом, прежде чем окно увидит их. Клавиатурные сокращения - классический пример, они должны быть обнаружены независимо от того, какое окно имеет фокус.

Любая библиотека классов GUI раскрывает это с помощью виртуального метода с названием что-то вроде App.PreProcessMessage, виртуальной функции, которую можно переопределить, чтобы ваша программа могла реализовать свои собственные сочетания клавиш и т.д.

18
ответ дан 29 November 2019 в 05:24
поделиться

TranslateMessage () преобразует сообщения виртуальных клавиш в сообщения ввода символов.

Это отдельный вызов для удаленной возможности того, что при определенных обстоятельствах вы захотите не создавать сообщения ввода символов для определенных виртуальных клавиш.

0
ответ дан 29 November 2019 в 05:24
поделиться

Это разные звери.

Для функция TranslateMessage

Переводит сообщения виртуальной клавиши в символьные сообщения. Персонаж сообщения отправляются вызывающему очередь сообщений потока, чтобы прочитать в следующий раз, когда поток вызовет Функция GetMessage или PeekMessage. [...] Функция TranslateMessage не изменить сообщение, на которое указывает Параметр lpMsg.

DispatchMessage , с другой стороны, отправляет сообщение оконной процедуре.

Итак, DispatchMessage выполняет фактическую работу по обработке сообщения. TranslateMessage МОЖЕТ или НЕ МОЖЕТ отправить новое сообщение в очередь цепочки. Если сообщение переведено, символьное сообщение отправляется в очередь сообщений потока.

Функция TranslateMessage не изменить сообщение, на которое указывает Параметр lpMsg.

Это отдельные вызовы, поэтому вы, программист, можете избежать перевода сообщения, обеспечиваемого TranslateMessage .

9
ответ дан 29 November 2019 в 05:24
поделиться

Приведем пример из MSDN:

Вы можете модифицировать цикл сообщений различными способами. Например, вы можете получать сообщения из очереди, не отправляя их в окно. Это полезно для приложений, которые отправляют сообщения без указания окна. Вы также можете направить GetMessage на поиск определенных сообщений, оставляя другие сообщения в очереди. Это полезно, если вам нужно временно обойти обычный порядок FIFO в очереди сообщений.

Вы также можете избежать вызова Translate message, если вам не нужно преобразовывать коды управления вводом с клавиатуры.

1
ответ дан 29 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: