Крючок ALT-ключ в надстройке VSTO Excel - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно решение на 99% заключено в принятом решении, связанном ниже:

Как выполнить событие .Onkey в надстройке Excel, созданной в 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

1 Ответ

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

Код в этом ответе не полностью действителен и не использует лучшие методы определения модификаторов.

Поскольку стандартная низкоуровневая клавиатурная зацепка не работала, я добавил LocalKeyboardHook в мою библиотеку InputHelper , в которой вместо WH_KEYBOARD_LL используется хук WH_KEYBOARD.Разница в том, что WH_KEYBOARD требует от вас внедрения DLL и указания потока в каждом процессе, который вы хотите подключить.К счастью, поскольку вы используете надстройку VSTO, InputHelper уже загружен в процесс Excel вместе с вашей надстройкой.

Скомпилированная DLL может быть загружена в Release моего проектараздел: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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...