Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Перехват нажатий на клавиатуру


Автор: ProgramerForever 29.4.2008, 06:17
Нужно, чтобы при нажатии на "~" вызывалась форма методом Show. Проблема в том, что на исходной форме очень-очень много элементов управления, и для каждого писать обработчик - неразумно и нерационально. Может есть способ??

Автор: Akina 29.4.2008, 08:13
Цитата(ProgramerForever @  29.4.2008,  07:17 Найти цитируемый пост)
на исходной форме очень-очень много элементов управления, и для каждого писать обработчик - неразумно и нерационально

Если контрол может получать фокус и обрабатывать нажатия (пусть и дефолтной процедурой) - для каждого такого контрола придется писАть процедуру. Впрочем, все они могут тупо вызывать одну и ту же Sub.
Плюс обработчик (уровня) формы.

Автор: voltaren 29.4.2008, 12:04
Есть метод это сделать средствами WinAPI и Timer

Код

Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer
Public Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer


Код


Public Sub Timer1_Timer()

    If ( GetAsyncKeyState(192) <> 0 ) then ' 192 это код клавиши тильды
    ' клавиша нажата

    End If


End Sub




Поидее код можно получить с помощью Asc("~")  только для тильды не работает а для букв работает, надо просто подобрать smile

Есть конечно еще метод, через Хуки это сделать но он сложнееsmile

Автор: ProgramerForever 29.4.2008, 12:37
Я понял, что последний вариант перехватывает клавиши отовсюду. А можно ли перехватывать с помощью API нажатия в активном окне?
А зачем эта строка?
Цитата(voltaren @  29.4.2008,  16:04 Найти цитируемый пост)
Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer


Ещё: Я потестил код. Он срабатывает n раз в секунду. А как обрабатывать ОДНО, КАЖДОЕ нажатие? Как я догадываюсь, с помощью хуков? Тех самых, которые 
Цитата

через Хуки это сделать но он сложнее smile

Автор: Insect 29.4.2008, 12:52
Цитата

А можно ли перехватывать с помощью API нажатия в активном окне?



можно отфильтровывать ненужное опять таки с использованием API функции (GetActiveWindow вроде как называецца)

Автор: voltaren 29.4.2008, 12:58
Insect прав с помощью функции GetActiveWindow проверять какое окно активное smile
не понял что вы имели ввиду под этой фразой "А как обрабатывать ОДНО, КАЖДОЕ нажатие?" ?

Автор: ProgramerForever 29.4.2008, 14:28
Типа кейлоггера (но мне не для этого smile ). Нажал клавишу - сработало событие в моей программе, хотя она, допустим, свёрнута.

Автор: Insect 29.4.2008, 15:01
ProgramerForever, тагда фильтр по хэндлу smile 

Автор: ProgramerForever 29.4.2008, 15:08
Код

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


Public Sub Timer1_Timer()
    If (GetAsyncKeyState(192) <> 0) Then   ' 192 ýòî êîä êëàâèøè òèëüäû
    ' êëàâèøà íàæàòà
    Beep
    End If
End Sub

Пробуй код, сразу поймёшь о чём я. мне надо не 100 раз в секунду, а один раз.

Автор: voltaren 29.4.2008, 20:18
а в чем проблема таймера надо поставить так что бы раз в секунду работал! Или например добавить переменную типа Boolean когда клавиша нажимается первый раз она становиться True и больше не срабатывает даже если клавиша нажата когда клавишу отпускаешь то переменная сбрасывается в False

Автор: Insect 30.4.2008, 08:38
ProgramerForever, ну других способов не знаю...
А чем тебя этот не устраивает? Боишься умыкнуть у винды лишний таймер? smile 

P.S. В BlitzBasic' е (специальный бейсик для быстрого написания игр) имеется такая функция как IfKeyHit(#код#)... Но использовать приложение, созданное на нём специально для твоей задачи, не выгодно- экзэшник минимум 800 Кб делает да и не факт что получиццо...

Автор: ProgramerForever 30.4.2008, 10:49
Цитата(voltaren @  30.4.2008,  00:18 Найти цитируемый пост)
 добавить переменную типа Boolean когда клавиша нажимается первый раз она становиться True и больше не срабатывает даже если клавиша нажата когда клавишу отпускаешь то переменная сбрасывается в False

Я обдумывал такой вариант, всё хорошо, но..
Цитата(voltaren @  30.4.2008,  00:18 Найти цитируемый пост)
 когда клавишу отпускаешь то переменная сбрасывается в False

Как это реализовать??

Автор: JusTalionis 1.5.2008, 16:36
Я обычно отслеживал время: после того как частота автоповтора прекратилась - значит отпущена клавиша. Собственно, это время задаст в твоей проге предел: с какой макс скоростью юзеру позволено долбить по этой клавише.
 

Автор: ProgramerForever 1.5.2008, 20:48
Точно! Буду копать в этом направлении.

Автор: Rrader 2.5.2008, 07:11
ProgramerForever, держи пример

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)