Вопрос № 71429: Уважаемые программисты! Имеется задачка по Visual Basic 6 - надо по нажатии одной или двух клавиш клавиатуры выполнить какую-либо функцию. Если использовать GetAsyncKeyState, то при нажатии на клавишу нужная функция запускается циклически, пока не от...
Вопрос № 71.429
Уважаемые программисты! Имеется задачка по Visual Basic 6 - надо по нажатии одной или двух клавиш клавиатуры выполнить какую-либо функцию. Если использовать GetAsyncKeyState, то при нажатии на клавишу нужная функция запускается циклически, пока не отпущу клавишу.
Вопрос - как сделать однократный запуск функции при нажатии клавиши? Как отследить тот момент, когда кнопка нажимается? Не нажата, а именно нажимается? Проблема также в том, что эта кнопка отслеживаться должа не только в моей программе, а глобально.
Отвечает: Alec Perle
Здравствуйте, Глашков Дмитрий Александрович!
Попробуйте воспользоваться функцией
Declare Function GetKeyState% Lib "user32" (ByVal nVirtKey As Long) - возвращает состояние заданной виртуальной клавиши на момент получения от нее последнего сообщения о вводе
nVirtKey - long - код проверяемой виртуальной клавиши.
возвращаемое значение - integer - бит 0 равен 1 для клавиш переключателей (CapsLock, NumLock, ScrollLock) если клавиша находится во включенном состоянии. Бит 15 равен 1 если клавиша нажата, и 0 если отпущена.
(Из книги Дэна Эпплмана "Win32 API и Visual Basic")
--------- Пессимист - это хорошо информированный оптимист (а оптимист - хорошо проинструктированный пессимист)
Ответ отправил: Alec Perle (статус: 1-ый класс)
Ответ отправлен: 17.01.2007, 22:19 Оценка за ответ: 4 Комментарий оценки: Спасибо за такой оперативный ответ. Но: С этой книгой я знаком, равно как и с этой API функцией. Дело в том, что до меня не доходит :(, как узнать, что клавиша _нажимается_ в данный момент времени и в этот момент выполнить, например, beep.
Отвечает: PsySex
Здравствуйте, Глашков Дмитрий Александрович!
>>как сделать однократный запуск функции при нажатии клавиши
В начале процедуры установите какую-нибудь логическую переменную и проверяйте её.
================
Sub SomeFunc()
if bStatus=True then Exit Sub
bStatus=True
..
.
End Sub
=================
Пока bStatus=True функция выполнятся не будет.
А также примерчик:
http://xakep-vb.narod.ru/main/vb/controls/KbdHook.rar
--------- Bom Shankar!
Ответ отправил: PsySex (статус: Студент)
Ответ отправлен: 17.01.2007, 22:25 Оценка за ответ: 4 Комментарий оценки: Реализовывать глобальные горячие клавиши через хук я считаю ненужной "роскошью". Тем более, у меня из-за этого KAV начал доставать сообщениями - перечислил все запущенные exeшники как клавиатурные перехватчики :( И все-таки, до меня не доходит, как через GetKeyState или GetAsyncKeyState реализовать однократный запуск процедуры по нажатии клавиши
(а не во время много раз). Ваш метод с переменной меня не устраивает тем, что процедура срабатывает один раз, а мне надо столько, сколько захочу.
Отвечает: Dimm77
Здравствуйте, Глашков Дмитрий Александрович!
Как простенький вариант, в случае не частого нажатия, можно поставить задержку на выполнение, т.е. таймер.
А касательно "Не нажата, а именно нажимается"... Как Вы себе это представляете? Отслеживать наростание интенсивности магнитного поля на контактах клавы? :) Вряд ли это возможно. А вот получить статус кнопки, и отсчитать от начала нажатия некий период - вполне реально. Впрочем, это дублирование первой части ответа.
--------- Цель жизни - жизнь.
Ответ отправил: Dimm77 (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 10:36 Оценка за ответ: 4 Комментарий оценки: Благодаря Alec Perle у меня все получилось.
Отвечает: Vvvv
Здравствуйте, Глашков Дмитрий Александрович!
Вот пример для приложения, ну а как перехватить нажатие клавиши глобально, не знаю Примеер для басика 2005, для шестого алгорит тотже...
Приложение:
Ответ отправил: Vvvv (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 16:40