Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 18:59   #1
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
По умолчанию Ожидание нажатия клавиши

Здравсвуйте. Как организовать в программе выполнение процедуры до нажатия определённой клавиши при условии что окно программы не имеет фокуса или окно программы вовсе отсутствует?
То есть процедура представляет собой повторяющийся цикл, в конце которого происходит проверка "была ли нажата такая-то клавиша?". Сам вопрос в том как это нажатие клавиши "поймать"?
blinkapec вне форума Ответить с цитированием
Старый 23.11.2010, 20:43   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

посмотри GetAsyncKeyState, с её помощью можно проверять состояние клавиш и кнопок.
maxionans вне форума Ответить с цитированием
Старый 23.11.2010, 22:52   #3
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
По умолчанию

Ага... Ок. Только есть ещё вопрос: а не получится ли так что моя процедура пропустит это нажатие? Т.е. полное время выполнения цикла около секунды и за это время будет нажато допустим 2 клавиши - сначала нужная, а затем какая-то другая и эта другая попадёт на момент проверки - то я просто пропущу нужную? Может быть можно организовать какой-то буфер (или он уже где-то системно организован?) кнопок, нажатых за последнюю секунду?

Последний раз редактировалось blinkapec; 23.11.2010 в 22:54.
blinkapec вне форума Ответить с цитированием
Старый 24.11.2010, 09:55   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

если у приложения есть окно и оно активно, т.е. имеет фокус, то информация о всех нажатых клавишах помещается в очередь сообщений этого окна, и их оттуда можно легко извлечь. если окна нет, то тогда имеет смысл завести ещё один поток, который бы формировал подобную очередь самостоятельно, а основной поток выбирал бы нужные данные из неё.
maxionans вне форума Ответить с цитированием
Старый 24.11.2010, 09:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а не получится ли так что моя процедура пропустит это нажатие?
ИМХО, может быть...
Я бы наверняка решал Хуками.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.11.2010, 16:43   #6
blinkapec
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 12
По умолчанию

Вот идея о хуках тоже проскачила, хотя и параллельный поток тоже имеет смысл... Буду экспериментировать. Хотя если честно пока что всё работает, так как совместно с функцией GetAsyncKeyState я использую две проверки возвращаемого значения: о том нажата ли клавиша и о том была ли она нажата со времени последней проверки. Всё пока что исправно работает, но проблема в том что я читал что если другой процесс вызовет функцию GetAsyncKeyState то флаг о том что кнопка была нажата сбросится... Как говорится слава богу пока видимо этого не случалось =)
blinkapec вне форума Ответить с цитированием
Старый 24.11.2010, 22:06   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

если нужна надёжность и 100% гарантия то надо использовать хуки.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват нажатия клавиши cw_o Win Api 10 08.02.2011 23:56
Ожидание нажатия клавиши shurik_7866 Общие вопросы Delphi 2 25.04.2010 19:53
Эмуляция нажатия клавиши helenfly Win Api 9 01.12.2009 12:09
время нажатия клавиши BattleMage Общие вопросы .NET 2 19.09.2009 13:41
Емулиривание нажатия клавиши xTANATOSx Win Api 9 10.10.2007 21:46