![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
x486 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 7.3.2007 Репутация: нет Всего: нет |
Как правильно обрабатывать нажатия одной и более клавиш? Пишу программу, не важно какую, на обработке сообщений окна у меня висит примерно такой код:
При этом, когда я зажимаю одновременно две клавиши происходит обращение к функции KeyDownFunc(wParam); сначала с кодом одной, а потом с кодом второй клавиши. Но когда я отпускаю одну из клавиш, я не получаю возможность отслеживать код оставшейся нажатой клавиши. Вопрос почему? В Функцию KeyUpFunc(wParam); передаётся коды обеих клавиш, не смотря на то, что одна из них по-прежнему нажата. Есть ли другие способы обрабатывать сообщения клавиатуры? Или я что-то не так сделал? |
|||
|
||||
NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
Можно так: завести переменную, которая будет принимать нужное значение, как только нажата одна из клавиш один раз, если после этого приходит код второй клавиши и эта переменная имеет значение, скажем, true, значит, нажаты обе клавиши. Если приходит код первой клавиши и значение true, значит, нажата она одна и значение переменить на false. Попробуй, вдруг поможет.
![]() Ещё можно запоминать время нажатия клавиш. Если между двумя клавишами меньше, скажем, полсекунды, то вперёд. |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
Я бы заводил для каждой клавиши свою переменную. Когда конкретная клавиша нажата соотв. переменная принимает значение True, отпущена- False. В любой момент видишь состояние любой клавиши...
-------------------- (С) kapbepucm |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Зачем переменные, когда есть GetKeyState?
-------------------- ... |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
Согласен, отзыв.
Я на JS рисовал, там не любят API... Это сообщение отредактировал(а) kapbepucm - 29.8.2007, 16:55 -------------------- (С) kapbepucm |
|||
|
||||
x486 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 7.3.2007 Репутация: нет Всего: нет |
Использование дополнительных флагов тоже ничего не даёт, а использовать GetKeyState нет никакого смысла (что, мне го в бесконечном цикле вызывать прикажите?), мне нужна именно обработка сообщений окна. Вот, например, немного доработанный кусок кода:
В принципе всё предельно просто, при нажатии клавиши в массиве M флаг соответствующей клавиши устанавливается в значение 1, если клавиша отпущена, он принимает значение 0. Отследить нажатие 2-х клавиш одновременно при этом не составляет труда по их кодам if (M[56] && M[78]) { Делать чё нибуть. } Проблема состоит в том, что если отпустить одну клавишу то оба флага принимают значение «false», точнее, перестаёт поступать событие WM_KEYDOWN: от всё ещё нажатой клавиши. Этого можно конечно избежать вызывая функцию KeyFunc(M); например, отдельным потоком таймера, но это как то не по феншую. |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Бесконечный цикл - вовсе не единственная альтертанива. При отпускании одной из клавиш (проверив, нажата ли еще вторая) ставь таймер с небольшим периодом и проверяй по таймеру. Например. -------------------- ... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |