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


Автор: Madest 15.2.2005, 17:18
Не могу очистить очередь сообщений от клавы и мыши.
Чего написать внутри цикла?
while(GetInputState())
{
...
}

Автор: srd 15.2.2005, 17:33
Сам не пробовал, но вроде надо так:
Код

while (GetInputState())
{
   MSG msg;
   PeekMessage(&msg, 0, 0, 0, PM_REMOVE | PM_QS_INPUT);
}

Ещё про WM_QUIT не забудь.

Автор: Madest 15.2.2005, 17:43
Так пробовал, но вроде не работает.
Код
while (GetInputState())
{
  MSG msg;
  PeekMessage(&msg, 0, 0, 0, PM_REMOVE | QS_ALLINPUT);
}


У меня дальше цикл, который прерывается нажатием любой клавиши
//Цикл 1
Код
do
{
 if(GetInputState())
 {
    ...
    return;
 }
  //действия
}
while(/*условия*/);

Но из него сразу выскакивает.
Это работало нормально до определенного момента, пока не пришлось кликать мышкой перед циклом 1. И теперь из-за того что очередь не пуста, цикл 1 вылетает сразу.
А кому WM_QUIT?

Автор: srd 15.2.2005, 17:55
Проверил под отладчиком, вариант
Код

       while (GetInputState())
       {
           MSG msg;
           PeekMessage(&msg, 0, 0, 0, PM_QS_ INPUT | PM_REMOVE);
       }

работает - 100%

В принципе, не так уж и сложно успеть засунуть в очередь сообщение после того, как отработал while (GetInputState()), но до второго цикла do {...}

Про WM_QUIT - PeekMessage выдергивает это сообщение не зависимо от того, какие флаги для фильтрации ты выставляешь.

З.Ы. Флаг QS_ALLINPUT - это не для PeekMessage, это для GetQueueStatus

Автор: Madest 15.2.2005, 18:04
Он мне пишет:
error C2065: 'PM_QS_INPUT' : undeclared identifier

Автор: srd 15.2.2005, 18:08
Какая ось?
Цитата

PM_QS_INPUT
Windows 98/Me, Windows 2000/XP: Process mouse and keyboard messages.

Автор: Madest 15.2.2005, 18:20
XP SP1

Автор: srd 15.2.2005, 18:24
До включения любых win32 заголовков напиши
Код

#define WINVER 0x0410

т.е. версия Windows 98 и выше.

Автор: Madest 15.2.2005, 18:52
Объявил в stdafx.h - не хочет smile
PM_QS_INPUT - так ли я пишу? В MSDN по поиску нашел такую. Чудеса.

Автор: srd 15.2.2005, 18:57
Наверное в шестом VC++ пишешь с устаревшим Platform SDK

Автор: Madest 16.2.2005, 11:10
А может есть другие варианты?
Вот если перед циклом 1 поставить любой MessageBox(), то он (цикл 1) работает нормально, т.е. очередь очищается. Но беда в том, что этот MessageBox там совсем не нужен.
Правда, пишу в шестом, с SP5.

Автор: Madest 16.2.2005, 11:26
А вообще, я чего-то недопонимаю...
Почему тогда простая строка перед циклом 1
Код
while(GetInputState());

не приводит к бесконечному циклу,
но в цикле 1 условие
Код
if(GetInputState()) return;

срабатывает?

Автор: Madest 3.3.2005, 16:58
Если кому интересно, придумал как ее очистить:
Создал пустой диалог, у которого в OnInitDialog() вызываю CDialog::OnOK().
Перед циклом 1 его запускаю модально. Он не показывается, но очередь очищается почему-то smile

Добавлено @ 17:02
Нет, кажется поторопился...

Работает-таки. Только между вызовом диалога и циклом нужна еще строка while(GetInputState());

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