注册 3 个热键?可能的?

Posted

技术标签:

【中文标题】注册 3 个热键?可能的?【英文标题】:Registering 3 hotkeys? Possible? 【发布时间】:2012-12-19 13:08:44 【问题描述】:

您好,我正在尝试在 VB.NET 中使用 RegisterHeyKeys,但是我让它与 2 个热键一起工作,我尝试在第三个中添加它并且它提供了太多参数。这可能是一件非常简单的事情,我也是一个小块,所以放轻松。哈哈。任何帮助将不胜感激。

这是目前为止的代码:

Public Const MOD_CONTROL As Integer = &H11
Public Const MOD_SHIFT As Integer = &H10
Public Const WM_HOTKEY As Integer = &H312

<DllImport("User32.dll")> _
Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, _
ByVal id As Integer, ByVal fsModifiers As Integer, _
ByVal vk As Integer) As Integer
End Function

<DllImport("User32.dll")> _
Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, _
                    ByVal id As Integer) As Integer
End Function

Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
    RegisterHotKey(Me.Handle, 100, MOD_CONTROL, MOD_SHIFT, Keys.D2)
    RegisterHotKey(Me.Handle, 200, MOD_CONTROL, MOD_SHIFT, Keys.D3)
    RegisterHotKey(Me.Handle, 300, MOD_CONTROL, MOD_SHIFT, Keys.D4)
End Sub

【问题讨论】:

【参考方案1】:

我看到的问题是您添加了两个修饰符MOD_CONTROLMOD_SHIFT 并用逗号分隔它们,表示您有五个函数参数,即使它只需要四个。尝试像这样将您的修饰符组合在一起。您还应该使用文档验证您的修饰键,它们似乎不正确。

Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
    RegisterHotKey(Me.Handle, 100, MOD_CONTROL Or MOD_SHIFT, Keys.D2)
    RegisterHotKey(Me.Handle, 200, MOD_CONTROL Or MOD_SHIFT, Keys.D3)
    RegisterHotKey(Me.Handle, 300, MOD_CONTROL Or MOD_SHIFT, Keys.D4)
End Sub

来自documentation 它声明(强调我的):

fsModifiers [in] 类型:UINT

必须与 uVirtKey 参数指定的键一起按下才能生成 WM_HOTKEY 消息的键。 fsModifiers 参数可以是以下值的组合

   Value                        Meaning

MOD_ALT 0x0001         Either ALT key must be held down.

MOD_CONTROL 0x0002     Either CTRL key must be held down.

MOD_NOREPEAT 0x4000   Changes the hotkey behavior so that the keyboard auto-repeat does not yield multiple hotkey notifications. 
                      Windows Vista and Windows XP/2000:  This flag is not supported.
MOD_SHIFT 0x0004      Either SHIFT key must be held down.

MOD_WIN 0x0008        Either WINDOWS key was held down. These keys are labeled with the Windows logo. Keyboard shortcuts
                      that involve the WINDOWS key are reserved for use by the operating system

这是您的程序的一个工作示例。

Public Const MOD_CONTROL As Integer = &H2
Public Const MOD_SHIFT As Integer = &H4
Public Const WM_HOTKEY As Integer = &H312

<DllImport("User32.dll")> _
Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, _
                                      ByVal id As Integer, ByVal fsModifiers As Integer, _
                                      ByVal vk As Integer) As Integer
End Function

<DllImport("User32.dll")> _
Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, _
                ByVal id As Integer) As Integer
End Function

Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
    RegisterHotKey(Me.Handle, 100, MOD_CONTROL Or MOD_SHIFT, Keys.D2)
    RegisterHotKey(Me.Handle, 200, MOD_CONTROL Or MOD_SHIFT, Keys.D3)
    RegisterHotKey(Me.Handle, 300, MOD_CONTROL Or MOD_SHIFT, Keys.D4)
End Sub

Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
    MyBase.DefWndProc(m)
    If m.Msg = WM_HOTKEY Then
        Select Case CType(m.WParam, Integer)
            Case 100
                NotifyIcon1.Text = "Hello"
                NotifyIcon1.ShowBalloonTip(2000, "", NotifyIcon1.Text, ToolTipIcon.Info)
            Case 200
                NotifyIcon1.Text = "World"
                NotifyIcon1.ShowBalloonTip(2000, "", NotifyIcon1.Text, ToolTipIcon.Info)
            Case 300
                NotifyIcon1.Visible = False
                If Not Visible Then Visible = True
        End Select
    End If
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Me.Hide()
    NotifyIcon1.Icon = Me.Icon
    NotifyIcon1.Visible = True
End Sub

【讨论】:

我不确定我知道你所说的修饰符是什么意思。我知道你所说的错误值是什么意思。但是这些的正确值是多少?我不明白。对不起,菜鸟问题。 :P 修饰符是 MOD_CONTROL 和 MOD_SHIFT。我在答案中包含了文档,将它们视为我使用微软命名法的控制键。正确的值应该是:MOD_CONTROL = &H2 和 MOD_SHIFT = &H4 @JJR。我刚刚添加了我用来测试的示例 啊,我明白了。好吧,这段代码可以工作,非常感谢你,但是,当它最小化到托盘时它仍然不起作用。我对其他论坛帖子的印象是,如果您使用注册热键,即使程序被最小化到托盘,它也会起作用。现在它在没有聚焦时在后台工作,但在托盘中时却不行。有什么想法吗? @JJR。当我正常最小化它时它可以工作,你如何将它最小化到托盘?

以上是关于注册 3 个热键?可能的?的主要内容,如果未能解决你的问题,请参考以下文章

电脑qq热键冲突怎么办

在 Cocoa/Objective-C 中请求热键

如何使用 WPF 和 .NET 3.5 注册全局热键以说出 CTRL+SHIFT+(LETTER)?

为啥按下热键组合时没有触发我的注册热键

【即用】amnesiac 的 Everything 热键

Cocoa NSStatusBar 全局热键