Tengo en algún lugar de mi código una función de bucle que llama al PeekMessage
para recuperar eventos.Cómo usar PeekMessage para recuperar todos los mensajes excepto la entrada (mouse + teclado)
Actualmente se tiene el siguiente aspecto:
while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
{
// Process events
}
Ahora me gustaría administrar la entrada en una ubicación diferente, lo que significa que me gustaría recuperar mensajes tales como WM_KEYDOWN
, WM_MOUSEMOVE
(eventos de ratón y teclado) en una lugar diferente, en un momento diferente de mi ciclo principal.
PeekMessage
's argumentos tercero y cuarto permiten definir una serie de mensajes para volver, así que podrían utilizar esta, usando macros proporcionados WM_KEYFIRST
, WM_KEYLAST
, WM_MOUSEFIRST
y WM_MOUSELAST
. Pero no es conveniente porque tengo dos rangos para verificar la entrada y, por lo tanto, tres rangos para todo lo que queda.
El último parámetro es un indicador y podría pasar PM_REMOVE | PM_QS_INPUT
para la entrada. Pero entonces, ¿qué debería pasar en el otro ciclo, donde quiero obtener todos los demás mensajes? No hay macro PM_QS_EVERYTHING_EXCEPT_INPUT
...
¿Cuál sería la forma más elegante de hacer esto?
Su última bandera que no existe se puede visualizar como '~ PM_QS_INPUT', que se puede combinar con' PM_REMOVE' mediante OR. – chris
Sí, eso podría ser una solución. Pero no me satisface porque esta bandera tiene dos sementics diferentes: 1) qué tipo de mensaje recuperar (PM_QS_ *), y 2) qué hacer con el mensaje (PM_REMOVE, PM_NOREMOVE, pero también PM_NOYIELD que no hago) querer establecer, y potencialmente, cualquier nueva bandera en la próxima versión de Windows). No encontré ninguna macro para separar esos dos sementics, aunque mirando los valores reales, los 16 primeros bits están reservados para el segundo. – Benlitz
Mi error, debería usar el '~ PM_QS_INPUT', pero solo enmascara el rango de bits que se aplica a los indicadores de ese tipo. Tenía un cerebro fallado allí. Entonces, si la última mitad es para eso, la primera mitad sería 0, y todos menos 'PM_QS_INPUT' en la última mitad serían 1. – chris