Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 462
от 22.01.2007, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 236, Экспертов: 37
В номере:Вопросов: 1, Ответов: 4


Вопрос № 71429: Уважаемые программисты! Имеется задачка по Visual Basic 6 - надо по нажатии одной или двух клавиш клавиатуры выполнить какую-либо функцию. Если использовать GetAsyncKeyState, то при нажатии на клавишу нужная функция запускается циклически, пока не от...

Вопрос № 71.429
Уважаемые программисты! Имеется задачка по Visual Basic 6 - надо по нажатии одной или двух клавиш клавиатуры выполнить какую-либо функцию. Если использовать GetAsyncKeyState, то при нажатии на клавишу нужная функция запускается циклически, пока не отпущу клавишу.
Вопрос - как сделать однократный запуск функции при нажатии клавиши? Как отследить тот момент, когда кнопка нажимается? Не нажата, а именно нажимается? Проблема также в том, что эта кнопка отслеживаться должа не только в моей программе, а глобально.
Отправлен: 17.01.2007, 21:56
Вопрос задал: Глашков Дмитрий Александрович (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.41 beta от 19.01.2007
Яндекс Rambler's Top100

В избранное