WPF-在VB.NET中分配全局热键
我试图在WPF中实现全局热键(即使不关注表单也会激活),但使用的是VB.NET。关于使用C#有很多例子,但我花了几个小时试图转换这些,但都没有成功 我曾经让他们使用RegisterHotkey在WinForms中工作,但是WPF中不再有Wndproc 基本上,我只需要一个热键,比如Alt+a,在我的代码中运行一个私有的Sub 如果有人能帮上忙,我们将不胜感激 谢谢, 沃利 WPF中不再有Wndproc 实际上,;) 对于全局热键,可以使用my,它具有WPF和WinForms的绑定。这些示例是用C#编写的,但是您可以轻松地将它们转换为VB.NET WPF中不再有Wndproc 实际上,;)WPF-在VB.NET中分配全局热键,wpf,vb.net,Wpf,Vb.net,我试图在WPF中实现全局热键(即使不关注表单也会激活),但使用的是VB.NET。关于使用C#有很多例子,但我花了几个小时试图转换这些,但都没有成功 我曾经让他们使用RegisterHotkey在WinForms中工作,但是WPF中不再有Wndproc 基本上,我只需要一个热键,比如Alt+a,在我的代码中运行一个私有的Sub 如果有人能帮上忙,我们将不胜感激 谢谢, 沃利 WPF中不再有Wndproc 实际上,;) 对于全局热键,可以使用my,它具有WPF和WinForms的绑定。这些示例是用C
对于全局热键,可以使用my,它具有WPF和WinForms的绑定。示例是用C#编写的,但是您可以轻松地将它们转换为VB.NET。好的,我已经完成了!使用WPF和VB.NET添加全局热键可以通过添加以下引用(Mainwindow.xmal.VB)完成: 然后将以下内容添加到代码隐藏中:
<DllImport("User32.dll")> _
Private Shared Function RegisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer, <[In]> fsModifiers As UInteger, <[In]> vk As UInteger) As Boolean
End Function
<DllImport("User32.dll")> _
Private Shared Function UnregisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer) As Boolean
End Function
Private _source As HwndSource
Private Const HOTKEY_ID As Integer = 9000
Protected Overrides Sub OnSourceInitialized(e As EventArgs)
MyBase.OnSourceInitialized(e)
Dim helper = New WindowInteropHelper(Me)
_source = HwndSource.FromHwnd(helper.Handle)
_source.AddHook(AddressOf HwndHook)
RegisterHotKey()
End Sub
Protected Overrides Sub OnClosed(e As EventArgs)
_source.RemoveHook(AddressOf HwndHook)
_source = Nothing
UnregisterHotKey()
MyBase.OnClosed(e)
End Sub
Private Sub RegisterHotKey()
Dim helper = New WindowInteropHelper(Me)
Const VK_F10 As UInteger = &H79
Const MOD_CTRL As UInteger = &H2
' handle error
If Not RegisterHotKey(helper.Handle, HOTKEY_ID, MOD_CTRL, VK_F10) Then
End If
End Sub
Private Sub UnregisterHotKey()
Dim helper = New WindowInteropHelper(Me)
UnregisterHotKey(helper.Handle, HOTKEY_ID)
End Sub
Private Function HwndHook(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr
Const WM_HOTKEY As Integer = &H312
Select Case msg
Case WM_HOTKEY
Select Case wParam.ToInt32()
Case HOTKEY_ID
OnHotKeyPressed()
handled = True
Exit Select
End Select
Exit Select
End Select
Return IntPtr.Zero
End Function
Private Sub OnHotKeyPressed()
MsgBox("Hello world!")
End Sub
希望这对别人有帮助。贷记到转换代码的“max”:
好的,我已经做到了!使用WPF和VB.NET添加全局热键可以通过添加以下引用(Mainwindow.xmal.VB)完成: 然后将以下内容添加到代码隐藏中:
<DllImport("User32.dll")> _
Private Shared Function RegisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer, <[In]> fsModifiers As UInteger, <[In]> vk As UInteger) As Boolean
End Function
<DllImport("User32.dll")> _
Private Shared Function UnregisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer) As Boolean
End Function
Private _source As HwndSource
Private Const HOTKEY_ID As Integer = 9000
Protected Overrides Sub OnSourceInitialized(e As EventArgs)
MyBase.OnSourceInitialized(e)
Dim helper = New WindowInteropHelper(Me)
_source = HwndSource.FromHwnd(helper.Handle)
_source.AddHook(AddressOf HwndHook)
RegisterHotKey()
End Sub
Protected Overrides Sub OnClosed(e As EventArgs)
_source.RemoveHook(AddressOf HwndHook)
_source = Nothing
UnregisterHotKey()
MyBase.OnClosed(e)
End Sub
Private Sub RegisterHotKey()
Dim helper = New WindowInteropHelper(Me)
Const VK_F10 As UInteger = &H79
Const MOD_CTRL As UInteger = &H2
' handle error
If Not RegisterHotKey(helper.Handle, HOTKEY_ID, MOD_CTRL, VK_F10) Then
End If
End Sub
Private Sub UnregisterHotKey()
Dim helper = New WindowInteropHelper(Me)
UnregisterHotKey(helper.Handle, HOTKEY_ID)
End Sub
Private Function HwndHook(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr
Const WM_HOTKEY As Integer = &H312
Select Case msg
Case WM_HOTKEY
Select Case wParam.ToInt32()
Case HOTKEY_ID
OnHotKeyPressed()
handled = True
Exit Select
End Select
Exit Select
End Select
Return IntPtr.Zero
End Function
Private Sub OnHotKeyPressed()
MsgBox("Hello world!")
End Sub
希望这对别人有帮助。贷记到转换代码的“max”:
您好,非常感谢您的回复。我以前试过你的NHotkey库,但没有成功,但似乎我放弃得太快了。我刚刚又尝试了一次,但是我得到了一个错误“error 5参数没有为参数'sender'指定'Private Function OnIncrement(sender作为Object,e作为NHotkey.HotkeyEventArgs)作为Object.”的参数'sender',以及e….@wallcloud,我不明白在这种情况下错误消息是什么意思,但它应该是一个
子,不是功能
嘿,托马斯,谢谢你的帮助。我必须有一个函数,否则它会给出错误“不返回值”。我还尝试了keybinding xaml选项“HotkeyManager.RegisterGlobalHotkey”,但它只会在窗体处于焦点时注册。可能是我如何设置命令的问题。但无论如何:)我找到了解决方案。谢谢!@WallyCloud,我必须有一个函数,否则它将给出错误”不会返回值“:您的代码中一定有错误,因为传递给AddOrReplace的委托不应该返回值……您好,非常感谢您的回复。我以前试过你的NHotkey库,但没有成功,但似乎我放弃得太快了。我刚刚又尝试了一次,但是我得到了一个错误“error 5参数没有为参数'sender'指定'Private Function OnIncrement(sender作为Object,e作为NHotkey.HotkeyEventArgs)作为Object.”的参数'sender',以及e….@wallcloud,我不明白在这种情况下错误消息是什么意思,但它应该是一个子,不是功能
嘿,托马斯,谢谢你的帮助。我必须有一个函数,否则它会给出错误“不返回值”。我还尝试了keybinding xaml选项“HotkeyManager.RegisterGlobalHotkey”,但它只会在窗体处于焦点时注册。可能是我如何设置命令的问题。但无论如何:)我找到了解决方案。谢谢!@WallyCloud,我必须有一个函数,否则它将给出错误”不会返回值“:您的代码中一定有错误,因为传递给AddOrReplace的委托不应返回值…的可能重复?的可能重复?
Const VK_F10 As UInteger = &H79
Const MOD_CTRL As UInteger = &H2