Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > PeekMessage без Input


Автор: Tiarwe 8.3.2013, 11:23
Здравствуйте! Подскажите, как заставить функцию PeekMessage обрабатывать все сообщений, за исключением (!) ввода?

Автор: GremlinProg 10.3.2013, 07:26
Ввод - это в смысле PM_QS_INPUT - "mouse and keyboard messages"?
С помощью двух PeekMessage подряд. Первый с флагом PM_QS_INPUT | PM_REMOVE второй - обычным - с флагом PM_REMOVE.

Добавлено @ 07:32
Клавиатурный и мышиный ввод в таком случае будет отсеиваться в цикле обработки сообщений потока.

Автор: Tiarwe 10.3.2013, 10:52
Спасибо) Обрабатывать можно лишь в таком порядке? Т.е. нельзя извратиться, чтобы обработать все сообщения кроме ввода, а затем его?

Автор: GremlinProg 10.3.2013, 11:55
Цитата(Tiarwe @  10.3.2013,  12:52 Найти цитируемый пост)
нельзя извратиться, чтобы обработать все сообщения кроме ввода, а затем его?

Можно, конечно сначала обработать остальные сообщения:
Код

PeekMessage( ..., MAKELONG( PM_REMOVE, 0x07ff & ~QS_INPUT ) );

Но второй PeekMessage, с PM_QS_INPUT | PM_REMOVE нужно вызывать обязательно, иначе цикл обработки сообщений не будет погружаться в ядро, т.к. PeekMessage будет всегда возвращать TRUE. Второй Peek с флагом PM_REMOVE нужен как раз, чтобы подчистить очередь от необрабатываемых сообщений.

Автор: GremlinProg 10.3.2013, 12:38
более дружественный вариант флага:
Код

PM_REMOVE | ( ( 0x07ff & ~QS_INPUT ) << 16 )

0x07ff - это для того, чтобы накрыть все статусы маской, т.к. они распространяются до значения 0x0400,
в будущем, маска может быть расширена, поэтому стоит попробовать 0x0ffff

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)