2012-05-13 11 views
7

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?

+1

Su última bandera que no existe se puede visualizar como '~ PM_QS_INPUT', que se puede combinar con' PM_REMOVE' mediante OR. – chris

+0

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

+2

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

Respuesta

1

Puede intentar usar "Filtros". Win32 llama a esos "ganchos", eche un vistazo a la función SetWindowsHookEx de msdn. tienes la posibilidad de instalar un filtro específico para los mensajes del teclado y el mouse. Luego puede enviar los mensajes a una cola de su mantenimiento y acceder a ellos manualmente más tarde (sabiendo que puede eliminar los mensajes relacionados de la cola pública para esa cadena si elige, desde el enlace, para que solo su cola de usuario tenga los mensajes). sin embargo, simplemente podría presionar directamente a esta cola de uso directamente desde el interruptor PeekMessage en cada caso que le interese.

Cuestiones relacionadas