Страница: 1 |
|
Вопрос: Отслеживание клавиатуры
|
Добавлено: 10.12.08 13:38
|
|
Автор вопроса: KreAtoR
|
Подскажите функцию, с помощью которой я могу отследить нажатые клавиши. Мне необходимо отключить некоторые кнопки(к примеру Виндовс или Alt+F4 или капс) на тот момент пока программа работает. Нуджно разрешить нажатие только трех кнопок. лево, право, пробел. При нажатии этих кнопок, должна быть нажата кнопка в программе. Остальные кнопки виндовс должен игнорировать.
подскажите!!!
Ответить
|
Номер ответа: 5 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #5
|
Добавлено: 10.12.08 21:08
|
Ладно, уговорил, отключим левый вин в системе.
- Option Explicit
-
- Private Sub Form_Load()
- hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
- End Sub
-
- Private Sub Form_Unload(Cancel As Integer)
- UnhookWindowsHookEx hHook
- End Sub
- Option Explicit
- Public Const WM_KEYDOWN = &H100
- Public Const WH_KEYBOARD_LL = 13
-
- Public Type KBDLLHOOKSTRUCT
- vkCode As Long
- scanCode As Long
- flags As Long
- time As Long
- dwExtraInfo As Long
- End Type
-
- Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
- Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
- Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
-
- Public hHook As Long
-
- Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Dim kbstruct As KBDLLHOOKSTRUCT
- If ncode < 0 Then
- LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
- Exit Function
- End If
- CopyMemory kbstruct, ByVal lParam, LenB(kbstruct)
- Select Case wParam
- Case WM_KEYDOWN
- If kbstruct.vkCode = 91 Then
- LowLevelKeyboardProc = 1
- Exit Function
- End If
- End Select
- LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
- End Function
-
-
Ответить
|
Номер ответа: 7 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #7
|
Добавлено: 12.12.08 21:41
|
Дружище, Executioner, WH_KEYBOARD_LL то самое счастливое исключение, смотри там же в msdn.
код не будет работать Так проверь.
Ответить
|
Номер ответа: 11 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #11
|
Добавлено: 12.12.08 23:50
|
Хук WH_KEYBOARD_LL не инжектируется в другой процесс. Вместо этого, контекст переключается обратно на процесс, который устанавливал хук, и в нем вызывает свой оригинальный контекст. Затем контекст переключается обратно на приложение, которое сгенерировало событие.
Я осведомлен о том, что все остальные хуки, для нормальной работы в глобальной видимости требуют, как ты и сказал, library-defined callback function. Но я проверял, и WH_KEYBOARD_LL, WH_MOUSE_LL - исключения.
Работает, правда только на семействе NT, и не все комбинации клавиш можно перехватить, но в жизни вообще мало что универсально.
Ответить
|
Страница: 1 |
Поиск по форуму