Articulo de referencia

Bucle de mensajes en Microsoft Windows

El bucle de mensajes es una sección de código obligatoria en todo programa que utiliza una interfaz gráfica de usuario en Microsoft Windows . [ 1 ] Los programas de Windows que ...

El bucle de mensajes es una sección de código obligatoria en todo programa que utiliza una interfaz gráfica de usuario en Microsoft Windows . [ 1 ] Los programas de Windows que tienen una GUI son controlados por eventos . Windows mantiene una cola de mensajes individual para cada hilo que ha creado una ventana. Normalmente, solo el primer hilo crea ventanas. Windows coloca mensajes en esa cola cada vez que hay actividad del ratón en la ventana de ese hilo, cada vez que hay 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 sobre ellos. 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. Normalmente 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 se presenta de la siguiente manera:

int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MSG msg ; int 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 ni -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 convencional que el bucle de eventos llame TranslateMessagea cada mensaje que pueda traducir 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 procesa. Los distribuye mediante una llamada DispatchMessagea un método que transfiere el mensaje al procedimiento de ventana correspondiente. (El procedimiento de ventana es un procedimiento de devolución de llamada que se asoció a la clase de ventana al registrarse). (Varias ventanas pueden usar 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 ningún 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 programen un bucle de mensajes de Windows, ya que enrutan automáticamente eventos como pulsaciones de teclas y clics del ratón a sus controladores correspondientes, tal como se definen en el marco. Sin embargo, cada marco implementa un bucle de mensajes en algún punto, y este bucle suele poder ser accedido o reemplazado cuando se requiere un control más directo.

Véase también

Referencias

  1. "Entrando en el bucle de mensajes" . 25 de marzo de 2010. Consultado el 23 de noviembre de 2023 .
  • Recorriendo el laberinto del enrutamiento de mensajes y comandos de MFC (MSJ, julio de 1995)
  • La odisea de una tecla: el recorrido de un mensaje de pulsación de tecla a través de la VCL.
  • SDK de la plataforma: Mensajes y colas de mensajes
  • Uso de mensajes y colas de mensajes (MSDN)
  • Función GetMessage
  • Función PeekMessage