Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使用VSTO捕获MSword中的按键事件?_Vb.net_Vsto_Office Interop - Fatal编程技术网

Vb.net 如何使用VSTO捕获MSword中的按键事件?

Vb.net 如何使用VSTO捕获MSword中的按键事件?,vb.net,vsto,office-interop,Vb.net,Vsto,Office Interop,我是VSTO VB.Net编程新手。我正在开发一个word应用程序级插件,希望捕获按键事件。我试过各种各样的钩法,但都不管用。我想使用WH\u-KEYBOARD而不是WH\u-KEYBOARD\u-LL来使用应用程序级钩子。下面的代码,我已经尝试陷阱只有一个关键的中风后,它停止。而且我也不知道该把键盘放在哪里。我将如何使用以下内容来处理关键事件 Public Event KeyDown As KeyEventHandler Public Event KeyPress As KeyPressEv

我是VSTO VB.Net编程新手。我正在开发一个word应用程序级插件,希望捕获按键事件。我试过各种各样的钩法,但都不管用。我想使用
WH\u-KEYBOARD
而不是
WH\u-KEYBOARD\u-LL
来使用应用程序级钩子。下面的代码,我已经尝试陷阱只有一个关键的中风后,它停止。而且我也不知道该把键盘放在哪里。我将如何使用以下内容来处理关键事件

Public Event KeyDown As KeyEventHandler

Public Event KeyPress As KeyPressEventHandler

Public Event KeyUp As KeyEventHandler
我使用的代码是

Imports System.ComponentModel

Imports System.Windows.Forms

Imports System.Runtime.InteropServices

Public Class KeyBoardHook
    Inherits Component
    Dim PredictString As String

#Region "     keyboardHook"
    Private Declare Auto Function LoadLibrary Lib "kernel32" (ByVal lpFileName As String) As IntPtr
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hhk As IntPtr) As Boolean
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, _
    ByVal lpfn As KeyboardProc, ByVal hmod As IntPtr, ByVal dwThreadId As Integer) As IntPtr
    Private Delegate Function KeyboardProc(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
    Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr

    Private Structure KBDLLHOOKSTRUCT
        Public vkCode As Integer
        Public scanCode As Integer
        Public flags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Structure

    'Keyboard Constants
    Private Const HC_ACTION As Integer = 0
    Private Const WM_KEYDOWN As Integer = &H100
    Private Const WM_KEYUP As Integer = &H101
    Private Const WM_SYSKEYDOWN As Integer = &H104
    Private Const WM_SYSKEYUP As Integer = &H105

    Private Const WH_KEYBOARD As Integer = 2
    Public hKeyboardHook As IntPtr

    Public Event KeyDown As KeyEventHandler
    Public Event KeyPress As KeyPressEventHandler
    Public Event KeyUp As KeyEventHandler

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer

    Private Const VK_ALT As Integer = &H12
    Private Const VK_CONTROL As Integer = &H11
    Private Const VK_SHIFT As Integer = 16

    <MarshalAs(UnmanagedType.FunctionPtr)> Private callback As KeyboardProc

    Public Sub HookKeyboard()
        callback = New KeyboardProc(AddressOf KeyboardCallback)
        Dim hInstance As IntPtr = LoadLibrary("User32")
        hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, callback, hInstance, 0)
        CheckHooked()
    End Sub

    Private Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
        Dim xy As System.Drawing.Point = Cursor.Position()
        Try
            If (Code = HC_ACTION Or Code = 3) Then
                Dim CapsLock As Boolean = GetKeyState(Keys.CapsLock) = 1
                Dim shifting As Boolean = False
                Dim modifiers As Keys
                If GetAsyncKeyState(VK_CONTROL) <> 0 Then
                    modifiers = modifiers Or Keys.Control
                End If
                If GetAsyncKeyState(VK_SHIFT) <> 0 Then
                    modifiers = modifiers Or Keys.Shift
                    shifting = True
                End If
                If GetAsyncKeyState(VK_ALT) <> 0 Then
                    modifiers = modifiers Or Keys.Alt
                End If
                Static lastKeys As Keys
                Select Case wParam
                    Case WM_KEYDOWN, WM_SYSKEYDOWN
                        RaiseEvent KeyDown(Me, New KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers))
                        If lastKeys <> (DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers) Then
                            lastKeys = (DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers)
                            If CapsLock AndAlso shifting Then
                                RaiseEvent KeyPress(Me, New KeyPressEventArgs(Char.ToLower(Chr(lParam.vkCode))))
                            ElseIf Not CapsLock AndAlso shifting Then
                                RaiseEvent KeyPress(Me, New KeyPressEventArgs(Char.ToUpper(Chr(lParam.vkCode))))
                            ElseIf Not shifting Then
                                If CapsLock Then
                                    RaiseEvent KeyPress(Me, New KeyPressEventArgs(Char.ToUpper(Chr(lParam.vkCode))))
                                Else
                                    RaiseEvent KeyPress(Me, New KeyPressEventArgs(Char.ToLower(Chr(lParam.vkCode))))
                                End If
                            End If
                        End If
                    Case WM_KEYUP, WM_SYSKEYUP
                        If CapsLock AndAlso shifting Then
                            RaiseEvent KeyUp(Me, New KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers))
                        ElseIf Not CapsLock AndAlso shifting Then
                            RaiseEvent KeyUp(Me, New KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers))
                        ElseIf Not shifting Then
                            If CapsLock Then
                                RaiseEvent KeyUp(Me, New KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers))
                            Else
                                RaiseEvent KeyUp(Me, New KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode)), Keys) Or modifiers))
                            End If
                        End If
                        lastKeys = Nothing
                End Select
            End If

            MsgBox("Keypressed is -> " & lParam.vkCode)
            Return CallNextHookEx(hKeyboardHook, Code, wParam, lParam)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

    Private Function keyboardHooked() As Boolean
        Return hKeyboardHook <> IntPtr.Zero
    End Function

    Public Sub UnhookKeyboard()
        If keyboardHooked() Then
            UnhookWindowsHookEx(hKeyboardHook)
        End If
    End Sub
#End Region
    Private Sub CheckHooked()
        If keyboardHooked() Then
            MsgBox("Keyboard hooked")
        Else
            MsgBox("Keyboard hook failed: " & Err.LastDllError)
        End If
    End Sub
End Class
导入System.ComponentModel
导入System.Windows.Forms
导入System.Runtime.InteropServices
公共类键盘钩
继承组件
将字符串设置为字符串
#区域“键盘挂钩”
私有将自动函数LoadLibrary Lib“kernel32”(ByVal lpFileName作为字符串)声明为IntPtr
将私有函数unhookwindowshookx Lib“user32”(ByVal hhk作为IntPtr)声明为布尔值
私有声明函数SetWindowsHookEx Lib“user32”别名“SetWindowsHookExA”(ByVal idHook作为整数_
ByVal lpfn作为KeyboardProc,ByVal hmod作为IntPtr,ByVal dwThreadId作为Integer)作为IntPtr
私有委托函数KeyboardProc(ByVal代码为整数,ByVal wParam为整数,ByRef lParam为KBDLLHOOKSTRUCT)作为IntPtr
私有声明函数CallNextHookEx Lib“user32”(ByVal hHook作为IntPtr,ByVal nCode作为Integer,ByVal wParam作为Integer,ByRef lParam作为KBDLLHOOKSTRUCT)作为IntPtr
私有结构KBDLLHOOKSTRUCT
作为整数的公共vkCode
作为整数的公共扫描码
作为整数的公共标志
作为整数的公共时间
公共dwExtraInfo作为整数
端部结构
'键盘常数
私有常量HC_操作为整数=0
Private Const wmu KEYDOWN作为整数=&H100
私有常量WM_KEYUP为整数=&H101
私有常量WM_SYSKEYDOWN为整数=&H104
私有常量WM_SYSKEYUP为整数=&H105
专用常量WH_键盘为整数=2
作为IntPtr的公共hKeyboardHook
作为KeyEventHandler的公共事件KeyDown
公共事件KeyPress作为KeyPressEventHandler
作为KeyEventHandler的公共事件KeyUp
将私有函数GetAsyncKeyState库“user32”(ByVal vKey作为整数)声明为整数
将私有函数GetKeyState Lib“user32”(ByVal nVirtKey作为整数)声明为整数
私有常量VK_ALT为整数=&H12
私有常量VK_控件为整数=&H11
私有常量VK_移位为整数=16
作为KeyboardProc的私有回调
公用子键盘()
callback=新的KeyboardProc(KeyboardCallback的地址)
Dim hInstance作为IntPtr=LoadLibrary(“User32”)
hKeyboardHook=setWindowshookx(WH_键盘,回调,hInstance,0)
勾选()
端接头
私有函数键盘回调(ByVal代码为整数,ByVal wParam为整数,ByRef lParam为KBDLLHOOKSTRUCT)为IntPtr
尺寸xy为System.Drawing.Point=光标.Position()
尝试
如果(代码=HC\U动作或代码=3),则
将CapsLock设置为布尔值=GetKeyState(Keys.CapsLock)=1
尺寸移动为布尔值=假
将修改器变暗为关键帧
如果GetAsyncKeyState(VK_控件)为0,则
修饰符=修饰符或键。控件
如果结束
如果GetAsyncKeyState(VK_SHIFT)为0,则
修改器=修改器或关键点。Shift
移位=真
如果结束
如果GetAsyncKeyState(VK_ALT)为0,则
修饰符=修饰符或键。Alt
如果结束
静态键作为键
选择案例wParam
案例WM\U KEYDOWN,WM\U SYSKEYDOWN
RaiseEvent键关闭(Me、新的KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode))、键)或修饰符))
如果是lastKeys(DirectCast(Asc(Chr(lParam.vkCode)),Keys)或修饰符,那么
lastKeys=(DirectCast(Asc(Chr(lParam.vkCode)),键)或修饰符)
如果CapsLock和Also移动,则
RaiseEvent按键(Me,新按键事件参数(Char.ToLower(Chr(lParam.vkCode)))
否则,如果不是CapsLock,那么也是移位
RaiseEvent按键(Me,新的按键事件参数(Char.ToUpper(Chr(lParam.vkCode)))
否则就不动了
如果是卡普斯洛克的话
RaiseEvent按键(Me,新的按键事件参数(Char.ToUpper(Chr(lParam.vkCode)))
其他的
RaiseEvent按键(Me,新按键事件参数(Char.ToLower(Chr(lParam.vkCode)))
如果结束
如果结束
如果结束
案例WM\U KEYUP,WM\U SYSKEYUP
如果CapsLock和Also移动,则
RaiseEvent键组(Me、新的KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode))、键)或修饰符))
否则,如果不是CapsLock,那么也是移位
RaiseEvent键组(Me、新的KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode))、键)或修饰符))
否则就不动了
如果是卡普斯洛克的话
RaiseEvent键组(Me、新的KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode))、键)或修饰符))
其他的
RaiseEvent键组(Me、新的KeyEventArgs(DirectCast(Asc(Chr(lParam.vkCode))、键)或修饰符))
如果结束
如果结束
lastKeys=无
结束选择
如果结束
MsgBox(“按下的键是->”&lParam.vkCode)
返回CallNextHookEx(hKeyb