РЕДАКТИРОВАТЬ ДЛЯ ЭТИХ СЛЕДУЮЩИХ КОММЕНТАРИЙ:
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