2012-09-05 18 views
7

programas de Win32 generalmente tienen un bucle de mensajes que los bucles llamando GetMessage o PeekMessage, y luego llama DispatchMessage para enviar el mensaje a la ventana proceedure de la ventana correspondiente.¿Es necesario llamar a DispatchMessage en los programas de win32?

¿Pero hay alguna necesidad de hacer esto? ¿Puedo simplemente mirar en el objeto MSG directamente en el bucle de mensajes y realizar las acciones necesarias allí sin llamar al DispatchMessage? Estoy hablando de casos en los que tengo una ventana única sin otros controles de ventana, por ejemplo, si la ventana solo se usa como una ventana de visualización de direct3d, por lo que los mensajes siempre se dirigirán a la única ventana.

Principalmente soy curioso pero también podría llevar a que ciertos aspectos de mi código sean más limpios también.

Respuesta

12

Llama al DispatchMessage para que el mensaje se entregue en la ventana adecuada, en su "ventana proc". ¿Crees que tienes una sola ventana, pero es realmente la única? COM creará ventanas auxiliares, otros subsistemas también pueden crear ventanas ocultas de ayuda, quién entregará los mensajes publicados en la cola de mensajes compartidos y se dirigirá a esas ventanas. Sin tener que pensar mucho sobre estos detalles, tienes API para enviarlos. Y tienes que hacerlo porque esos subsistemas dependen de la presencia de mensaje bomba.

Spy++ La herramienta de SDK de Windows puede ayudarlo a ver cuántas ventanas realmente tiene.

Aún si de hecho tiene la única ventana, no importa mucho si su controlador es llamado desde el interior de DispatchMessage, o directamente desde su bomba de mensajes.

+0

¡Eso tiene sentido, gracias! – jcoder

+1

'DispatchMessage' y' CallWindowProc' también hacen cosas como considerar los ganchos de Windows. Incluso con una sola ventana, debe usarlos. Creo que algunos mensajes no se pueden procesar correctamente fuera de 'DispatchMessage', pero no tengo ningún ejemplo fuera de lo común. Tal vez cosas como 'WM_PAINT'. – tenfour

+1

@tenfour, quizás lo más correcto es decir que algunos mensajes se llamarán de todos modos a través de WindowProc, y no existirán como mensajes separados en la cola. Por lo tanto, WindowProc es una necesidad en cualquier caso. Aún así, los publicados en la cola pueden manejarse de ambas formas. No puedo pensar en las razones por las que uno querría manejarlas allí mismo en el lado de la bomba. –

Cuestiones relacionadas