Сообщения WM_TIMER подавляются при нажатии и удерживании мыши над кнопкой Windows X - PullRequest
2 голосов
/ 08 ноября 2011

Я работаю над игрой, в которой клиенту необходимо продолжить обработку сообщений Windows, иначе игру можно будет использовать. Чтобы решить эту проблему во время событий изменения размера окна и перетаскивания, у нас есть сообщение WM_TIMER, которое запускается каждые 50 мсек, что перезапускает основной цикл событий.

Проблема заключается в том, что этот метод не работает, когда пользователь нажимает и удерживает кнопку X или минимизирует оконного клиента. (Таким образом, они не завершают щелчок, они просто останавливают клиента.)

Используя Spy ++, последние сообщения, которые я вижу:

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

Ничего не следует, пока я не переместлю мышь, и нет сообщений WM_TIMER, пока я не отпущу кнопку мыши.

Итак, вопрос в том, что, когда я нахожу мышь над кнопкой X окна, есть ли что-то, от чего я мог бы отключить, чтобы заставить клиента снова двигаться? Или что-то, что я мог сделать, чтобы наши «сторожевые» сообщения WM_TIMER сработали?

Ответы [ 3 ]

4 голосов
/ 08 ноября 2011

Некоторые системные события, такие как системное меню (как в вашем случае) или изменение размера окна, останавливают обычные сообщения окна на некоторое время. Вам нужно переосмыслить свою архитектуру и, возможно, запустить периодическую операцию во вторичном потоке. Там вы можете использовать WaitForSingleObject или просто Sleep () вместо таймера на основе сообщений.

3 голосов
/ 08 ноября 2011

Я могу придумать пару вариантов.

  1. Когда нажатие кнопки происходит в не клиентской области, системный код может запускать свой собственный цикл сообщений до тех пор, пока кнопка не будет отпущена. Этот цикл сообщений может не отправлять сообщения WM_TIMER.

  2. Я считаю, что WM_TIMER особенный, потому что это сообщение с более низким приоритетом. WM_TIMER извлекается из очереди только тогда, когда больше нечего извлечь (что-то вроде WM_PAINT). Таймеры Windows в конечном итоге срабатывают, и никогда раньше указанного периода, но они не очень надежны, если вам нужно регулярное сердцебиение.

Как предположил другой человек, вам может понадобиться вторая нить, чтобы поддерживать жизнь.

0 голосов
/ 08 ноября 2011

Рассмотрите возможность использования периодического ожидаемого таймера .Он будет работать независимо, в отдельном потоке.

...