WPF-在VB.NET中分配全局热键

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

我试图在WPF中实现全局热键(即使不关注表单也会激活),但使用的是VB.NET。关于使用C#有很多例子,但我花了几个小时试图转换这些,但都没有成功

我曾经让他们使用RegisterHotkey在WinForms中工作,但是WPF中不再有Wndproc

基本上,我只需要一个热键,比如Alt+a,在我的代码中运行一个私有的Sub

如果有人能帮上忙,我们将不胜感激

谢谢, 沃利

WPF中不再有Wndproc

实际上,;)

对于全局热键,可以使用my,它具有WPF和WinForms的绑定。这些示例是用C#编写的,但是您可以轻松地将它们转换为VB.NET

WPF中不再有Wndproc

实际上,;)


对于全局热键,可以使用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