Доброе утро, форумчане.
Помогите разобраться.
У меня есть макрос - клавиатурный хук. Выполняет он следующую функцию: перехватывает нажатия клавиш на клавиатуре - и запускает более мелкие макросы в соответствии с той клавишей - которая нажата (стрелки влево-вправо-вверх-вниз).
Но в нем есть одно ограничение - он перехватывает клавиатурные нажатия - только в том случае, если экселевская книга с его расположением является активной.
Как заставить макрос - перехватывать нажатия клавиш в любом случае, когда нажата одна из этих клавиш ?
(То есть даже когда, например в ТоталКоммандере на клавиатуре нажимается - клавиша "стрелка вверх" - макрос на экселевском листе - выводил бы сообщение "Up".)
Помогите разобраться.
У меня есть макрос - клавиатурный хук. Выполняет он следующую функцию: перехватывает нажатия клавиш на клавиатуре - и запускает более мелкие макросы в соответствии с той клавишей - которая нажата (стрелки влево-вправо-вверх-вниз).
Но в нем есть одно ограничение - он перехватывает клавиатурные нажатия - только в том случае, если экселевская книга с его расположением является активной.
Как заставить макрос - перехватывать нажатия клавиш в любом случае, когда нажата одна из этих клавиш ?
(То есть даже когда, например в ТоталКоммандере на клавиатуре нажимается - клавиша "стрелка вверх" - макрос на экселевском листе - выводил бы сообщение "Up".)
| Код |
|---|
Option Explicit Public Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _ ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long 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 GetCurrentThreadId Lib "kernel32" () As Long Public Const WH_KEYBOARD = 2 Public hHook As Long Public Hooked As Boolean Public Key As String Public Function KeyboardProc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long 'Debug.Print wParam раскомментировать чтобы посмотреть что будет при нажатии других клавиш If wParam = 37 Or wParam = 39 Or wParam = 38 Or wParam = 40 Or wParam = 32 Then Hooked = True If wParam = 37 Then Key = "Left" If wParam = 39 Then Key = "Right" If wParam = 38 Then Key = "Up" If wParam = 40 Then Key = "Down" If wParam = 32 Then Key = "Space" End If KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam) End Function Sub Start() Dim i As Long 'Типа Do Hooked = False hHook = SetWindowsHookEx(WH_KEYBOARD, _ AddressOf KeyboardProc, _ 0&, _ GetCurrentThreadId) 'Пока не хукнули (Hooked=true в KeyboardProc) While (Not Hooked) i = i + 1 Cells(1, 1) = i 'Без этого зависает DoEvents Wend Call UnhookWindowsHookEx(hHook) MsgBox Key 'И типа Loop End Sub |
Изменено: - 14.03.2017 02:27:06