Почему «TranslateMessage» и «DispatchMessage» являются отдельными вызовами? - PullRequest
20 голосов
/ 30 июня 2010

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

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

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

Ответы [ 4 ]

16 голосов
/ 30 июня 2010

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

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

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

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

9 голосов
/ 30 июня 2010

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

Для Функция TranslateMessage

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

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

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

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

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

1 голос
/ 30 июня 2010

Хорошо, приведу пример из MSDN :

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

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

0 голосов
/ 30 июня 2010

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

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

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