Крюк клавиатуры не работает?Функция обратного вызова KeyboardProc не выполняется? - PullRequest
0 голосов
/ 19 февраля 2019

РЕДАКТИРОВАТЬ ДЛЯ ЭТИХ СЛЕДУЮЩИХ КОММЕНТАРИЙ:

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowshookexa

HHOOK SetWindowsHookExA(
  int       idHook,
  HOOKPROC  lpfn,
  HINSTANCE hmod,
  DWORD     dwThreadId
);

lpfn

Тип: HOOKPROC

Указатель на процедуру подключения.Если параметр dwThreadId равен нулю или указывает идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на подключаемую процедуру в DLL.В противном случае lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом.

hmod

Тип: HINSTANCE

Дескриптор библиотеки DLL, содержащей процедуру подключения, на которую указывает параметр lpfn.Параметр hMod должен быть установлен в NULL, если параметр dwThreadId указывает поток, созданный текущим процессом, и если процедура подключения находится в коде, связанном с текущим процессом.


Я не понимаю, почему этоне работает.Для этой версии я не блокирую никаких хуков.Я просто делаю запись в текстовый файл, отмечая время, когда сообщение было обработано моей функцией обратного вызова клавиатуры.Однако, когда я прохожу свою основную программу, ловушка ловит ОК.Но KeyboardCallBack никогда не выполняется, я думаю, так как мой журнал пуст в безопасном для своего начального заголовка.

ПОСТОЯННЫЕ И АПИС:

Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" _
  Alias "SetWindowsHookExA" (ByVal idHook As Long, _
                             ByVal lpfn As Long, _
                             ByVal hmod As Long, _
                             ByVal dwThreadId As Long) As Long

Private Declare PtrSafe Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" _
  (pDest As Any, _
   pSource As Any, _
   ByVal cb As Long)

Private Declare PtrSafe Function CallNextHookEx Lib "user32" _
   (ByVal hHook As Long, _
   ByVal nCode As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long

Private Type KBDLLHOOKSTRUCT
  vkCode As Long
  scanCode As Long
  flags As Long
  time As Long
  dwExtraInfo As Long
End Type

Private Const HC_ACTION = 0
Private Const WH_KEYBOARD_LL = 13&
Private KeyboardHandle As Long

КРЮЧОК:

Public Sub HookKeyboard()
    KeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardCallback, Application.Hinstance, 0)
End Sub

ВЫЗОВ КЛАВИАТУРЫ И ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ:

Public Function KeyboardCallback(ByVal Code As Long, _
                                  ByVal wParam As Long, _
                                  ByVal lParam As Long) As Long
    Call TimeStamp
    Static Hookstruct As KBDLLHOOKSTRUCT

    If Code = HC_ACTION Then
        Call CopyMemory(Hookstruct, ByVal lParam, Len(Hookstruct))
        If BlockKey(Hookstruct) = True Then
            KeyboardCallback = 1
            Exit Function
        End If
    End If

  KeyboardCallback = CallNextHookEx(KeyboardHandle, _
    Code, wParam, lParam)
End Function

    Private Function BlockKey(ByRef Hookstruct As KBDLLHOOKSTRUCT) As Boolean
        BlockKey = False
    End Function

    Private Function TimeStamp()
        Dim FSO As Object
        Set FSO = CreateObject("Scripting.FileSystemObject")

        Dim TSO As Object
        Set TSO = FSO.OpenTextFile("C:\Users\evanm\Desktop\New Text Document.txt", 1)

        Dim FileString As String
        FileString = TSO.ReadAll
        TSO.Close

        FileString = FileString & " " & Now() & " "

        Set TSO = FSO.OpenTextFile("C:\Users\evanm\Desktop\New Text Document.txt", 2)
        TSO.WriteLine FileString
        TSO.Close

        Set FSO = Nothing
        Set TSO = Nothing
    End Function

ИСПЫТАНИЯ:

Sub testHook()
    Hook.HookKeyboard
Stop
'write a bunch of stuff
Stop
    Hook.UnhookKeyboard
End Sub

Sub testWriteFile()
    Hook.TimeStamp
End Sub
...