Большинство основных циклов Win32, которые я видел, все структурировано как:
while (GetMessage(&message, NULL, 0, 0) > 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
На это указали мне это MsgWaitForMultipleObjects
может использоваться для добавления некоторого разнообразия к основному циклу. Но есть ли сценарий где выполнение чего-то между GetMessage
, TranslateMessage
и DispatchMessage
на самом деле полезно?
Более традиционный цикл сообщений выглядит так:
while (GetMessage(&msg, 0, 0, 0))
{
if (!TranslateAccelerator(hwndMain, haccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Это довольно большой намек на то, что вы хотите сделать перед отправкой сообщения: поймать сообщения, которые должны быть перехвачены и обработаны особым образом, прежде чем окно увидит их. Клавиатурные сокращения - классический пример, они должны быть обнаружены независимо от того, какое окно имеет фокус.
Любая библиотека классов GUI раскрывает это с помощью виртуального метода с названием что-то вроде App.PreProcessMessage, виртуальной функции, которую можно переопределить, чтобы ваша программа могла реализовать свои собственные сочетания клавиш и т.д.
TranslateMessage ()
преобразует сообщения виртуальных клавиш в сообщения ввода символов.
Это отдельный вызов для удаленной возможности того, что при определенных обстоятельствах вы захотите не создавать сообщения ввода символов для определенных виртуальных клавиш.
Это разные звери.
Переводит сообщения виртуальной клавиши в символьные сообщения. Персонаж сообщения отправляются вызывающему очередь сообщений потока, чтобы прочитать в следующий раз, когда поток вызовет Функция GetMessage или PeekMessage. [...] Функция TranslateMessage не изменить сообщение, на которое указывает Параметр lpMsg.
DispatchMessage , с другой стороны, отправляет сообщение оконной процедуре.
Итак, DispatchMessage
выполняет фактическую работу по обработке сообщения. TranslateMessage
МОЖЕТ или НЕ МОЖЕТ отправить новое сообщение в очередь цепочки. Если сообщение переведено, символьное сообщение отправляется в очередь сообщений потока.
Функция TranslateMessage не изменить сообщение, на которое указывает Параметр lpMsg.
Это отдельные вызовы, поэтому вы, программист, можете избежать перевода сообщения, обеспечиваемого TranslateMessage
.
Приведем пример из MSDN:
Вы можете модифицировать цикл сообщений различными способами. Например, вы можете получать сообщения из очереди, не отправляя их в окно. Это полезно для приложений, которые отправляют сообщения без указания окна. Вы также можете направить GetMessage на поиск определенных сообщений, оставляя другие сообщения в очереди. Это полезно, если вам нужно временно обойти обычный порядок FIFO в очереди сообщений.
Вы также можете избежать вызова Translate message, если вам не нужно преобразовывать коды управления вводом с клавиатуры.