Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetInputState(), не могу очистить очередь сообщений 
:(
    Опции темы
Madest
Дата 15.2.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Не могу очистить очередь сообщений от клавы и мыши.
Чего написать внутри цикла?
while(GetInputState())
{
...
}
--------------------
PM MAIL   Вверх
srd
Дата 15.2.2005, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Сам не пробовал, но вроде надо так:
Код

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

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



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Madest
Дата 15.2.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



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


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

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


Это сообщение отредактировал(а) Madest - 15.2.2005, 17:58
--------------------
PM MAIL   Вверх
srd
Дата 15.2.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Проверил под отладчиком, вариант
Код

       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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Madest
Дата 15.2.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Он мне пишет:
error C2065: 'PM_QS_INPUT' : undeclared identifier
--------------------
PM MAIL   Вверх
srd
Дата 15.2.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Какая ось?
Цитата

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



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Madest
Дата 15.2.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



XP SP1
--------------------
PM MAIL   Вверх
srd
Дата 15.2.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



До включения любых win32 заголовков напиши
Код

#define WINVER 0x0410

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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Madest
Дата 15.2.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



Объявил в stdafx.h - не хочет smile
PM_QS_INPUT - так ли я пишу? В MSDN по поиску нашел такую. Чудеса.

--------------------
PM MAIL   Вверх
srd
Дата 15.2.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 4
Всего: 49



Наверное в шестом VC++ пишешь с устаревшим Platform SDK


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Madest
Дата 16.2.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Madest - 16.2.2005, 11:12
--------------------
PM MAIL   Вверх
Madest
Дата 16.2.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



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

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

срабатывает?
--------------------
PM MAIL   Вверх
Madest
Дата 3.3.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 27.11.2003
Где: Городок

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) Madest - 3.3.2005, 17:14
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.