【问题标题】:WPF - Assigning Global hotkeys in VB.NETWPF - 在 VB.NET 中分配全局热键
【发布时间】:2016-05-10 14:57:50
【问题描述】:

我正在尝试在 WPF 中使用 VB.NET 实现全局热键(即使没有关注表单也可以激活)。有很多关于使用 C# 的示例,但我已经尝试了几个小时来转换这些示例,但都无法正常工作。

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

基本上我只想要一个热键(例如 Alt+A)在我的代码中运行 Private Sub。

如果有人能提供帮助,我们将不胜感激。

谢谢, 沃利

【问题讨论】:

标签: wpf vb.net


【解决方案1】:

好的,我做到了!可以通过添加这些引用 (Mainwindow.xmal.vb) 来使用 WPF 和 VB.NET 添加全局热键:

Imports System.Runtime.InteropServices
Imports System.Windows.Interop

然后将以下代码添加到后面的代码中:

<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

这是用于 Ctrl+F10。可以根据here 中的Keycodes 和here 中的Key modifiers 修改以下内容来更改它。只需将 0x 替换为 &H。

    Const VK_F10 As UInteger = &H79
    Const MOD_CTRL As UInteger = &H2

希望这对某人有所帮助。归功于转换代码的“max”: Global hotkeys in WPF working from every window

【讨论】:

    【解决方案2】:

    WPF 中不再有 Wndproc...

    其实,there is ;)

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

    【讨论】:

    • 您好,非常感谢您的回复。我之前尝试过您的 NHotkey 库,但未能使其正常工作,但似乎我放弃得太早了。我现在再次尝试过,但是我收到错误“错误 5 Argument not specified for parameter 'sender' of 'Private Function OnIncrement(sender As Object, e As NHotkey.HotkeyEventArgs) As Object'。”以及对于电子.....
    • @WallyCloud,我不明白在这种情况下错误消息是什么意思,但它应该是Sub,而不是Function
    • 嗨,托马斯,感谢您的帮助。我必须有一个函数,否则它会给出错误“不返回值”。我还尝试使用键绑定 xaml 选项“HotkeyManager.RegisterGlobalHotkey 但它只会在表单处于焦点时注册。可能是我如何设置命令的问题。但无论如何:) 我设法找到了解决方案。谢谢!
    • @WallyCloud,我必须有一个函数,否则它会给出错误“不返回值”:你的代码一定有问题,因为委托传递给 AddOrReplace 不应该返回值...
    猜你喜欢
    • 2011-05-28
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2023-03-03
    • 2021-05-17
    相关资源
    最近更新 更多