Передача идентификатора потока в SetWindowsHookEx - PullRequest
0 голосов
/ 18 февраля 2019

Мои два вызова API:

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 Function GetCurrentThreadId Lib "kernel32" () As Long

Функция My Hook Keyboard:

Public Sub HookKeyboard()
    Dim ThreadID As Long
    ThreadID = GetCurrentThreadId

    KeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardCallback, Application.Hinstance, ThreadID)

    Call HookedInitalize
End Sub

По какой-то причине мой хукне ловитьЕсли я заменю ThreadID на 0, указывая, что хук должен быть общесистемным, то хук ДЕЙСТВИТЕЛЬНО ловит.Но когда я пытаюсь ограничить его только приложением, оно не срабатывает.

1 Ответ

0 голосов
/ 18 февраля 2019

WH_KEYBOARD_LL является глобальным крюком, поэтому вы должны передать 0 в качестве идентификатора потока.По-другому это не сработает.

Это можно увидеть в документации по SetWindowsHookExA функции ;в частности, в разделе «Примечания» , где перечисляются типы хуков и их области действия.

Также примечание: если вы должны были вызвать Err.LastDllError после попытки вызвать SetWindowsHookEx сненулевой идентификатор потока, вы бы увидели ошибку ERROR_GLOBAL_ONLY_HOOK, предоставляющую ту же информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...