VB.net 组合键不起作用
VB.net Key Combinations doesn't work
以下代码适用于 Ctrl + D、F2 和 F7,但不适用于 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
语句中使用 And
或 AndAlso
,因为布尔值在 VB.NET 中是如何转换的。在这种情况下,只要第一个运算符只是 And
就可以了。使用下面的 AndAlso
s 是因为它们执行短路,这更快,因为 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(或其他组件)有意义,并不意味着它不会在 我们的 应用程序中捕获。
And
和 AndAlso
之间的区别在于,第一个从左到右一直计算布尔表达式直到最后,即使某些表达式的计算结果为 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
语句相比,它更可能是与硬件或驱动程序相关的问题。
以下代码适用于 Ctrl + D、F2 和 F7,但不适用于 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
语句中使用 And
或 AndAlso
,因为布尔值在 VB.NET 中是如何转换的。在这种情况下,只要第一个运算符只是 And
就可以了。使用下面的 AndAlso
s 是因为它们执行短路,这更快,因为 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
.
接受的答案完全不正确。
VB.NET 不是 C#。因此,如果 And
在具有 Boolean
的上下文中使用(在两侧),VB.NET 会自动切换到逻辑 And
而不是按位 And
。所以这根本不是问题。我只是 运行 OP 代码,它 运行 很好 - 成功捕获了 Ctrl + A 组合。此外,如果组合键对 OS(或其他组件)有意义,并不意味着它不会在 我们的 应用程序中捕获。
And
和 AndAlso
之间的区别在于,第一个从左到右一直计算布尔表达式直到最后,即使某些表达式的计算结果为 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
语句相比,它更可能是与硬件或驱动程序相关的问题。