繁体   English   中英

VSTO Excel加载项中的ALT键挂钩

[英]Hook ALT key in VSTO Excel Add-in

我需要的解决方案被99%封装在下面链接的可接受的解决方案中:

如何在使用Visual Studio 2010创建的Excel加载项中执行.Onkey事件?

但是,它似乎不适用于钩住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

该答案中的代码并不完全有效,并且没有使用确定修饰符的最佳方法。

由于标准的低级键盘挂钩LocalKeyboardHook ,因此我在InputHelper库中添加了LocalKeyboardHook ,该库使用WH_KEYBOARD挂钩而不是WH_KEYBOARD_LL 区别在于WH_KEYBOARD要求您注入DLL并在要挂接的每个进程中指定一个线程。 幸运的是,由于您使用的是VSTO加载项,因此InputHelper已随您的加载项一起加载到Excel流程中。

可以在我的项目的Release部分中下载编译的DLL:
https://github.com/Visual-Vincent/InputHelper/releases

(您也可以直接从存储库下载InputHelper.vb源文件)

用法示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM