2010-06-30 33 views
17

La mayor parte de los principales circuitos de Win32 que he visto son todos estructurado como:¿Por qué las llamadas separadas "TranslateMessage" y "DispatchMessage"?

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

Se señaló a mí que MsgWaitForMultipleObjects pueden usarse para añadir algo de variedad a un bucle principal. ¿Pero hay una situación en la que hacer algo entre GetMessage, TranslateMessage y DispatchMessage es realmente útil?

Respuesta

16

El bucle de mensajes más tradicional se ve así:

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

Es un muy buen indicio de lo que se quiere hacer antes de enviar el mensaje: los mensajes de captura que debe ser interceptados y tratamiento especial antes de la ventana los ve. Los atajos de teclado son un ejemplo clásico, necesitan ser detectados sin importar qué ventana tenga el foco.

Cualquier biblioteca de clases GUI lo expone con un método virtual llamado algo así como App.PreProcessMessage, una función virtual que se puede anular para que su programa pueda implementar sus propios atajos y demás.

+0

Ese es un buen ejemplo práctico, gracias. :) –

+1

solo se necesita confirmar dos años después ... –

+0

¿Está bien si traduzco y envío un mensaje más de una vez, o no traduzco y envío el mensaje? - He probado y no he visto ningún problema, pero solo quiero asegurarme de que realmente no sea un problema. – 123iamking

8

Son diferentes bestias.

Para TranslateMessage function

Traduce mensajes de tecla virtual en mensajes de carácter. Los mensajes de caracteres se publican en la cola de mensajes de la cadena de llamada , para leer la próxima vez que el hilo llame a la función GetMessage o PeekMessage. [...] La función TranslateMessage no modifica el mensaje apuntado por el parámetro lpMsg.

DispatchMessage, por otro lado, envía un mensaje a un procedimiento de ventana.

Así que DispatchMessage hace el trabajo real de procesar el mensaje. TranslateMessage PUEDE o NO PUEDE publicar un nuevo mensaje en la cola de subprocesos. Si el mensaje se traduce, se publica un mensaje de carácter en la cola de mensajes de la secuencia.

La función TranslateMessage no modificar el mensaje que apunta el parámetro LPMSG.

Son llamadas separadas por lo que usted, el programador, puede tener la oportunidad de evitar la traducción del mensaje proporcionado por TranslateMessage.

+0

Después de que se haya traducido un mensaje, ¿se enviará el mensaje de clave virtual por DispatchMessage? –

0

TranslateMessage() convierte mensajes de teclas virtuales a mensajes de entrada de caracteres.

Es una llamada separada para la remota posibilidad de que bajo ciertas circunstancias desee no producir mensajes de entrada de caracteres para ciertas teclas virtuales.

1

Bueno para citar un ejemplo de la MSDN:

Puede modificar un bucle de mensajes en una variedad de maneras. Por ejemplo, puede recuperar mensajes de la cola sin enviarlos a una ventana. Esto es útil para aplicaciones que publican mensajes que no especifican una ventana. También puede dirigir GetMessage para buscar mensajes específicos, dejando otros mensajes en la cola. Esto es útil si debe omitir temporalmente el orden FIFO habitual de la cola de mensajes.

También puede evitar las llamadas al mensaje Traducir si no necesita convertir los códigos de control de entrada del teclado.

Cuestiones relacionadas