Mensajes WM_TIMER suprimidos al hacer clic y mantener presionado el mouse sobre el botón X de Windows

Estoy trabajando en un juego en el que el cliente necesita seguir procesando los mensajes de Windows o, de lo contrario, se puede explotar el juego. Para resolver este problema durante el cambio de tamaño de la ventana y los eventos de arrastre, tenemos un WM_TIMER mensaje que se dispara cada 50 ms que reiniciará el bucle de eventos principal.

El problema es que esta técnica no funciona cuando un usuario hace clic y mantiene presionada la X o el botón minimizar de un cliente con ventana. (Por lo tanto, no completan el clic, simplemente detienen al cliente).

Usando Spy ++, los últimos mensajes que veo son:

<00731> 00160D3C P WM_NCLBUTTONDOWN nHittest:HTCLOSE xPos:1150 yPos:178
<00732> 00160D3C P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:1014 yPos:-23

Seguido de nada hasta que muevo el mouse, y no WM_TIMER mensajes hasta que suelte el botón del mouse.

Entonces, la pregunta es, mientras estoy en el estado de tener mi mouse sobre el botón X de la ventana, ¿hay algo que pueda presionar para que el cliente se mueva nuevamente? O algo que pudiera hacer para que nuestro "perro guardián" WM_TIMER mensajes de fuego?

preguntado el 08 de noviembre de 11 a las 16:11

3 Respuestas

Algunos eventos del sistema, como el menú del sistema (como en su caso) o el cambio de tamaño de la ventana, impiden que los mensajes habituales de la ventana se procesen durante un tiempo. Necesita repensar su arquitectura y tal vez ejecutar una operación periódica en un hilo secundario. Allí puede usar WaitForSingleObject o simplemente Sleep () en lugar del temporizador basado en mensajes.

respondido 08 nov., 11:20

Puedo pensar en un par de posibilidades.

  1. Cuando el botón se presiona en el área de no cliente, el código del sistema puede estar ejecutando su propio bucle de mensajes hasta que se suelte el botón. Es posible que este bucle de mensajes no envíe mensajes WM_TIMER.

  2. Creo que WM_TIMER es especial porque es un mensaje de menor prioridad. WM_TIMER solo se recupera de la cola cuando no hay nada más que recuperar (algo similar a WM_PAINT). Los temporizadores de Windows eventualmente se activan, y nunca antes del período especificado, pero no son muy confiables si necesita un latido regular.

Como sugirió otra persona, es posible que deba confiar en un segundo hilo para mantener las cosas vivas.

respondido 08 nov., 11:20

Considere el uso de publicaciones periódicas temporizador de espera. Se ejecutará de forma independiente, en un hilo separado.

respondido 08 nov., 11:20

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.