在 VS2008 调试器中调用 SetWindowsHookEx 总是返回 NULL

Posted

技术标签:

【中文标题】在 VS2008 调试器中调用 SetWindowsHookEx 总是返回 NULL【英文标题】:Calling SetWindowsHookEx inside VS2008 debugger always returns NULL 【发布时间】:2010-02-19 10:40:05 【问题描述】:

我们正在开发一个执行低级键盘挂钩的 .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

【问题讨论】:

我在使用调试器时从未见过它失败。其他事情正在发生。如果您需要帮助,请发布代码。 【参考方案1】:

猜测可能是 VS 正在运行 .vshost.exe 进程,该进程在反射中可能看起来不同,但我不能肯定地说。我们使用 'Process.GetCurrentProcess().MainModule` 来获取要传入的模块。也许可以尝试一下。

【讨论】:

无论如何我都会使用你的 Process.GetCurrentProcess().MainModule 因为看起来更干净。 更改代码时,我发现使用 Int 而不是 InPtr 时出现了 PInvoke 错误。我也开始使用 GetModuleHandle。这两件事并排使应用程序也可以在 VS 中运行。

以上是关于在 VS2008 调试器中调用 SetWindowsHookEx 总是返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

在 VS2010 或 VS 2008 中打开现有的 MakeFile 项目进行调试

VS2008如何设置才能使库函数静态链接

在 VS2008 中以不同用户身份调试应用程序

寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

VS2008 在IE中 调试 ActiveX控件

调试 XSLT 文件时 VS2008 SP1 崩溃