Vb.net 如何使用VSTO捕获MSword中的按键事件?
我是VSTO VB.Net编程新手。我正在开发一个word应用程序级插件,希望捕获按键事件。我试过各种各样的钩法,但都不管用。我想使用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
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