| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > GetInputState() |
| Автор: Madest 15.2.2005, 17:18 |
| Не могу очистить очередь сообщений от клавы и мыши. Чего написать внутри цикла? while(GetInputState()) { ... } |
| Автор: srd 15.2.2005, 17:33 | ||
Сам не пробовал, но вроде надо так:
Ещё про WM_QUIT не забудь. |
| Автор: Madest 15.2.2005, 17:43 | ||||
Так пробовал, но вроде не работает.
У меня дальше цикл, который прерывается нажатием любой клавиши //Цикл 1
Но из него сразу выскакивает. Это работало нормально до определенного момента, пока не пришлось кликать мышкой перед циклом 1. И теперь из-за того что очередь не пуста, цикл 1 вылетает сразу. А кому WM_QUIT? |
| Автор: srd 15.2.2005, 17:55 | ||
Проверил под отладчиком, вариант
работает - 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 | ||
Какая ось?
|
| Автор: Madest 15.2.2005, 18:20 |
| XP SP1 |
| Автор: srd 15.2.2005, 18:24 | ||
До включения любых win32 заголовков напиши
т.е. версия Windows 98 и выше. |
| Автор: Madest 15.2.2005, 18:52 |
| Объявил в stdafx.h - не хочет 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
не приводит к бесконечному циклу, но в цикле 1 условие
срабатывает? |
| Автор: Madest 3.3.2005, 16:58 |
| Если кому интересно, придумал как ее очистить: Создал пустой диалог, у которого в OnInitDialog() вызываю CDialog::OnOK(). Перед циклом 1 его запускаю модально. Он не показывается, но очередь очищается почему-то Добавлено @ 17:02 Нет, кажется поторопился... Работает-таки. Только между вызовом диалога и циклом нужна еще строка while(GetInputState()); |