Determinar la prioridad de un mensaje de ventana

3 minutos de lectura

¿Hay alguna forma de verificar mediante programación la prioridad de los mensajes de una ventana en su cola de mensajes?

Por ejemplo: algunos de los mensajes de ventana, WM_PAINT y WM_TIMER se sabe que tienen la prioridad más baja y se colocan después de los mensajes con la prioridad más alta.

Estoy buscando algo por lo que pueda confirmar cuál de los dos mensajes tendrá la prioridad más baja o más alta o qué mensaje se enviará primero o último.

  • Independientemente de si eso es posible, dependiendo del orden de los mensajes, está utilizando algo que no está cubierto por el contrato de API. Y eso hace que su programa sea vulnerable a romperse en la versión futura de Windows (u otra implementación como WINE). no lo hagas

    – Gato Plus Plus

    27 de agosto de 2011 a las 18:03

Determinar la prioridad de un mensaje de ventana
Hans Passant

No es así como funciona, los mensajes de Windows no tienen una prioridad adjunta. Está determinado principalmente por cómo se genera el mensaje. Un bucle de mensajes envía mensajes en este orden:

  • primero, los mensajes generados con SendMessage() se envían en el orden en que se realizaron las llamadas
  • a continuación, cualquier mensaje generado con PostMessage() y almacenado en la cola de mensajes, en orden de cola
  • a continuación, cualquier mensaje que se sintetice desde el estado de la ventana. WM_TIMER, WM_PAINT y WM_MOUSEMOVE encajan en esta categoría.

La cláusula ‘sintetizado a partir del estado de la ventana’ es lo que hace que WM_PAINT y WM_TIMER parezcan tener una prioridad baja. Y por qué mover el mouse rápidamente no inunda la cola de mensajes con mensajes del mouse. Sin embargo, eso no es exclusivo, puede, por ejemplo, llamar a UpdateWindow() para forzar el envío de un mensaje WM_PAINT, haciendo que se envíe con una ‘prioridad alta’.

  • No conocía el concepto de mensajes sintetizados. ¿Sabes dónde podría averiguar más? He leído a Petzold pero no recuerdo que se hayan discutido tales matices.

    –David Heffernan

    27 de agosto de 2011 a las 18:52

  • @David: lo siento, esta es una amalgama de cosas que leí hace más de una década y media. No recuerdo en qué revistas se publicó esto, hace tiempo que se fueron.

    -Hans Passant

    27 ago 2011 a las 19:00

  • @David: para WM_TIMER, documentos de MSDN msdn.microsoft.com/en-us/library/ms644902(v=vs.85).aspx – “el mensaje es publicado por la función GetMessage o PeekMessage” implica que se genera a pedido, en lugar de publicarse en la cola directamente como resultado de la expiración de un temporizador real. Parece existir una redacción similar con WM_PAINT, aunque allí es menos explícito. También, support.microsoft.com/kb/96006 agrega: “Los mensajes WM_TIMER y WM_PAINT se pueden considerar como conmutadores booleanos”, insinuando esto. No creo que esté en Petzold, pero aparece en el blog de Raymond Chen de vez en cuando.

    – Brendan McK

    28 de agosto de 2011 a las 5:30

  • Una pregunta a esta respuesta: ¿WM_KEYDOWN también tiene una calificación más baja que un mensaje WM_COMMAND enviado con PostMessage?

    – resonancia magnética nuclear

    17 de agosto de 2017 a las 7:57

El orden se define en Obtener mensaje / PeekMensaje documentación:

Si no se especifica ningún filtro, los mensajes se procesan en el siguiente orden:

  • Mensajes enviados
  • Mensajes publicados
  • Mensajes de entrada (hardware) y eventos internos del sistema
  • Mensajes enviados (otra vez)
  • Mensajes WM_PAINT
  • Mensajes WM_TIMER

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad