【发布时间】:2019-02-04 05:41:34
【问题描述】:
我需要的解决方案 99% 封装在下面链接的公认解决方案中:
How to perform .Onkey Event in an Excel Add-In created with Visual Studio 2010?
但是,它似乎不适用于挂接 ALT 键。我环顾四周,遇到了几个 C# 示例,但我是编程新手,而且我正在学习 VB .NET,因此以我的知识水平,我无法成功地将代码移植到其他 C# 示例中以使其在我的VB .NET 项目。
由于上面链接的代码已经完成了我需要的一切,我想继续使用它,但如果有人能告诉我如何让它也钩住 ALT 键,我将不胜感激。我想有一个常量需要以特定的方式传递和检查,但是自从找到这个解决方案后的最后 4 天里我一直无法弄清楚。任何帮助将不胜感激。
非常感谢!
编辑:@Vincent,这是我正在测试的代码,它因溢出错误而中断:
Imports InputHelperLib
Public Class ThisAddIn
Dim KeyboardHook As InputHelper.Hooks.LocalKeyboardHook
Private Sub ThisAddIn_Startup() Handles Me.Startup
KeyboardHook = New InputHelper.Hooks.LocalKeyboardHook
AddHandler KeyboardHook.KeyDown, AddressOf KeyboardHook_KeyDown
AddHandler KeyboardHook.KeyUp, AddressOf KeyboardHook_KeyUp
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
If KeyboardHook IsNot Nothing Then KeyboardHook.Dispose()
End Sub
Private Sub KeyboardHook_KeyDown(sender As Object, e As InputHelper.Hooks.KeyboardHookEventArgs)
If e.Modifiers = InputHelper.ModifierKeys.Alt AndAlso e.KeyCode = System.Windows.Forms.Keys.M Then
System.Windows.Forms.MessageBox.Show("ALT + M was pressed!")
End If
End Sub
Private Sub KeyboardHook_KeyUp(sender As Object, e As InputHelper.Hooks.KeyboardHookEventArgs)
If e.Modifiers = InputHelper.ModifierKeys.Alt AndAlso e.KeyCode = System.Windows.Forms.Keys.M Then
System.Windows.Forms.MessageBox.Show("ALT + M was released!")
End If
End Sub
End Class
【问题讨论】:
-
该代码并不完全有效,并且没有使用确定修饰符的最佳方法...我建议您查看我的名为 InputHelper 的库。它包含一个键盘钩子,它是通过大量研究创建的,以便尽可能正确(编码方面),我已经对其进行了彻底的测试,以确保它可以正常工作。在项目的 wiki 上有关于如何使用它的说明:Low-level keyboard hook
-
嗨文森特,这是一个令人印象深刻的项目。但是,它似乎不能在 Excel 中运行的 VSTO 加载项中可靠地工作。我发现如果我按照 wiki 文档实现它,它在 Winforms 应用程序中运行良好,但是当我的加载项加载时挂钩时,它不会触发 Excel 内部的事件,但只要我点击外部Excel,它的工作原理。我相信这可能是为相关应用程序域获取正确线程的问题?
-
这很奇怪...因为它安装了一个低级挂钩并使用 WinAPI 来执行此操作,所以它应该始终工作,因为 Windows 正在为您管理挂钩。该钩子在创建它的同一线程中运行。您可以编辑您的问题并包含您使用的代码吗?我得自己试试这个。您使用的是哪个版本的 Excel?
-
虽然我现在看到,在您之前链接的帖子中,它只挂钩了当前 AppDomain 的线程。如果我的库挂钩了当前桌面中的 all 线程,那么如果这个微小的细节产生了重大影响,那就太奇怪了。
-
我似乎无法重现该问题。我尝试了所有我能想到的实例化钩子和订阅事件处理程序的组合,并且每次都没有问题。我使用 Excel 2010 和 Visual Studio 2010,针对 .NET Framework 4.0。