stringtranslate.com

Bucle de mensajes en Microsoft Windows

El bucle de mensajes es una sección obligatoria del código en cada programa que utiliza una interfaz gráfica de usuario en Microsoft Windows . [1] Los programas de Windows que tienen una GUI están controlados por eventos . Windows mantiene una cola de mensajes individual para cada hilo que ha creado una ventana. Por lo general, solo el primer hilo crea ventanas. Windows coloca mensajes en esa cola siempre que se produce actividad del mouse en la ventana de ese hilo, siempre que se produce actividad del teclado mientras esa ventana tiene el foco y en otros momentos. Un proceso también puede agregar mensajes a su propia cola. Para aceptar la entrada del usuario, y por otras razones, cada hilo con una ventana debe recuperar continuamente mensajes de su cola y actuar en consecuencia. Un programador hace que el proceso haga eso escribiendo un bucle que llama a GetMessage (que se bloquea para un mensaje y lo recupera), y luego llama a DispatchMessage (que envía el mensaje) y se repite indefinidamente. Este es el bucle de mensajes. Por lo general, hay un bucle de mensajes en el programa principal , que se ejecuta en el hilo principal, y un bucle de mensajes adicional en cada cuadro de diálogo modal creado . Los mensajes de cada ventana del proceso pasan por su cola de mensajes y son gestionados por su bucle de mensajes. Un bucle de mensajes es un tipo de bucle de eventos .

Un bucle de mensajes básico aparece de la siguiente manera:

int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MSG msg ; BOOL bRet ;              mientras ( 1 ) { bRet = GetMessage ( & msg , NULL , 0 , 0 );         if ( bRet == -1 ) // Si bRet es -1, GetMessage ha fallado. { // Manejar o registrar el error; posiblemente salir. // ... } else if ( bRet != 0 ) // Si bRet no es 0 o -1, el mensaje debe procesarse. { TranslateMessage ( & msg ); DispatchMessage ( & msg ); } else // Si bRet es 0, el bucle de mensajes debe salir. { break ; } } return msg . wParam ; }                          

Es habitual que el bucle de eventos llame TranslateMessagea cada mensaje que pueda traducir las pulsaciones de teclas virtuales en cadenas . La llamada TranslateMessageno es técnicamente necesaria, pero pueden surgir problemas si no se llama. El bucle de mensajes debe llamar a DispatchMessage.

El bucle de mensajes no actúa directamente sobre los mensajes que maneja. Los envía llamando a DispatchMessage, que transfiere el mensaje al "procedimiento de ventana" de la ventana a la que estaba dirigido el mensaje. (El "procedimiento de ventana" es un procedimiento de devolución de llamada , que se asoció con la clase de ventana cuando se registró). (Más de una ventana puede utilizar el mismo procedimiento de ventana).

El código también puede enviar mensajes directamente a un procedimiento de ventana. Estos se denominan mensajes no en cola.

Un bucle de mensajes estricto no es la única opción. El código en otras partes del programa también puede aceptar y enviar mensajes. PeekMessagees una llamada no bloqueante que regresa inmediatamente, con un mensaje si hay alguno esperando, o sin mensaje si no hay ninguno esperando. WaitMessagepermite que un hilo se duerma hasta que haya un mensaje en la cola.

Los marcos de interfaz gráfica modernos , como Windows Forms , Windows Presentation Foundation , MFC , Delphi , Qt y otros, no requieren que las aplicaciones codifiquen un bucle de mensajes de Windows, ya que enrutan automáticamente eventos como pulsaciones de teclas y clics del mouse a sus controladores apropiados, tal como se define dentro del marco. Sin embargo, cada marco implementa un bucle de mensajes en algún lugar, y generalmente se puede acceder al bucle de mensajes o reemplazarlo cuando se requiere un control más directo.

Véase también

Referencias

  1. ^ "Entrando al bucle de mensajes". 25 de marzo de 2010. Consultado el 23 de noviembre de 2023 .

Enlaces externos