Вызов SetWindowsHookEx внутри отладчика VS2008 всегда возвращает NULL
-
21-09-2019 - |
Вопрос
мы работаем над приложением .Net, которое выполняет перехват клавиатуры на низком уровне.Когда мы вызываем SetWindowsHookEx, работающий внутри отладчика, вызов всегда завершается неудачно.
При запуске из скомпилированного исполняемого файла все работает нормально.Если мы прикрепим к процессам вызов SetWindowsHookEx, все тоже будет работать.
Я где-то читал (не помню), что VS уже выполняет перехват клавиатуры низкого уровня, но это не должно быть проблемой, поскольку есть функция CallNextHook.
Кто-то знает, что происходит?
РЕДАКТИРОВАТЬ:Код довольно простой, исключение выдается внутри отладчика, но не снаружи.
Public Sub New()
m_callback = New NativeMethods.KeyboardHookDelegate(AddressOf KeyboardCallback)
End Sub
Public Sub Start()
m_handle = NativeMethods.SetWindowsHookEx(NativeMethods.HookType.WH_KEYBOARD_LL, m_callback, Marshal.GetHINSTANCE(Reflection.Assembly.GetExecutingAssembly().GetModules()(0)).ToInt32, 0)
If m_handle = 0 Then
Throw New Exception()
End If
End Sub
Решение
Можно предположить, что VS запускает процесс .vshost.exe, который в отражении может выглядеть по-другому, но я не могу сказать наверняка.Мы используем Process.GetCurrentProcess().MainModule, чтобы передать модуль.Может быть, стоит попробовать.