VB.net 组合键不起作用

VB.net Key Combinations doesn't work

以下代码适用于 Ctrl + DF2F7,但不适用于 Ctrl + A。任何人都知道问题可能是什么?

Private Sub AgentSetupForm_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    Select Case e.KeyCode
        '  Ctrl + A
        Case Keys.A And (e.Control And Not e.Shift And Not e.Alt)
            Dim f As New InvestorAccountsForm
            f.MdiParent = TraderoomMDI
            f.Show()

            '  Ctrl + D 
        Case Keys.D And (e.Control And Not e.Shift And Not e.Alt)
            Dim f As New InvestorAddressForm
            f.MdiParent = TraderoomMDI
            f.Show()
            '  F2, F7 
        Case Keys.F2 'And (e.Shift And Not e.Control And Not e.Alt)
            Me.Text = "F2 Test"
        Case Keys.F7
            stlFormMode.Text = "Edit"
    End Select

End Sub

编辑:

您似乎对 CTRL + A 组合有问题,您可以尝试覆盖 ProcessCmdKey 并查看如果可行的话。应在处理键之前调用该方法 and/or 由 .NET 环境翻译。

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
    If keyData = (Keys.Control Or Keys.A) Then
        ...your code here...
        Return True
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

如果其他组合有效,您可以将它们保留在 KeyDown 事件中。


编辑 2:

@BozhidarStoinev 说得对;我说你目前正在使用按位 And 是错误的。

显然它可以在 Select Case 语句中使用 AndAndAlso,因为布尔值在 VB.NET 中是如何转换的。在这种情况下,只要第一个运算符只是 And 就可以了。使用下面的 AndAlsos 是因为它们执行短路,这更快,因为 AndAlso 仅在左侧为 True 时才评估右侧。

以下:

Keys.A And (e.Control AndAlso Not e.Shift AndAlso Not e.Alt)

转换为:

(65 And True) = (65 And -1) = 65 'I added parentheses for improved readability

或:

(65 And False) = (65 And 0) = 0

但不确定多语句案例是否每次都能正常工作。它可能适用于键,但由于 <anything> And False 等于零,如果您在另一个 Case.

中检查 0,则可能会出现意外结果

接受的答案完全不正确。 VB.NET 不是 C#。因此,如果 And 在具有 Boolean 的上下文中使用(在两侧),VB.NET 会自动切换到逻辑 And 而不是按位 And。所以这根本不是问题。我只是 运行 OP 代码,它 运行 很好 - 成功捕获了 Ctrl + A 组合。此外,如果组合键对 OS(或其他组件)有意义,并不意味着它不会在 我们的 应用程序中捕获。

AndAndAlso 之间的区别在于,第一个从左到右一直计算布尔表达式直到最后,即使某些表达式的计算结果为 False .后者计算表达式直到达到 False 或结束 - 即 短路 .

为了提高代码的可读性,您可以在 Case 语句中测试特定键。然后在特定情况下插入一个 If 块以检查控制键的条件:

Select Case e.KeyCode
    Case Keys.A 
        If e.Control AndAlso Not (e.Shift OrElse e.Alt)
            Dim f As New InvestorAccountsForm
            f.MdiParent = TraderoomMDI
            f.Show()
        End If
    '
    '
End Select

或者您可以分解出 If 块来包含 Select Case 用于所有与条件 e.Control AndAlso ... 相关的情况。

很遗憾,我无法回答您的问题,因为您的问题似乎无法(轻松)重现。根据评论,与代码中的 Case 语句相比,它更可能是与硬件或驱动程序相关的问题。