Сообщения WM_TIMER подавляются при нажатии и удержании мыши над кнопкой Windows X

Я работаю над игрой, в которой клиент должен продолжать обрабатывать сообщения 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 срабатывали?


person Zyrca    schedule 08.11.2011    source источник


Ответы (3)


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

person Eugene Mayevski 'Callback    schedule 08.11.2011

Я могу придумать пару возможностей.

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

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

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

person Adrian McCarthy    schedule 08.11.2011