我已经在窗体属性中将KeyPreview
设置为true
我正在开发一个小程序,但是当我按下并释放任何箭头键时,它似乎有些控件(位于GroupBox内)没有触发窗体的KeyDown事件,只触发了KeyUp事件。是否我的代码有问题导致这种情况发生?
具体地说,我已经在窗体上启用了KeyPreview,并在两个子例程的e.SuppressKeyPress = True
处设置了断点,只有frmMain_KeyUp的那个例程触发了断点。
我添加了两个GroupBox事件,希望这可以缓解问题,但没有这样的运气。但是,我在窗体上有一个自定义控件,专门编写了忽略这些按键的代码,该代码按预期工作。
Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown, GroupBox1.KeyDown, GroupBox2.KeyDown
e.SuppressKeyPress = True
Select Case e.KeyCode
Case Keys.Left
ScrollDir = ScrollDir Or 1
Case Keys.Right
ScrollDir = ScrollDir Or 2
Case Keys.Down
ScrollDir = ScrollDir Or 4
Case Keys.Up
ScrollDir = ScrollDir Or 8
Case Else
e.SuppressKeyPress = False
End Select
tScroll.Enabled = True
tScroll_Tick(Nothing, Nothing)
End Sub
Private Sub frmMain_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp, GroupBox1.KeyUp, GroupBox2.KeyUp
e.SuppressKeyPress = True
Select Case e.KeyCode
Case Keys.Left
ScrollDir = ScrollDir And (Not 1)
Case Keys.Right
ScrollDir = ScrollDir And (Not 2)
Case Keys.Down
ScrollDir = ScrollDir And (Not 4)
Case Keys.Up
ScrollDir = ScrollDir And (Not 8)
Case Else
e.SuppressKeyPress = False
End Select
If ScrollDir = 0 Then tScroll.Enabled = False
End Sub
在用户控件中“忽略”按键的代码如下:
Private Sub TileDropDown_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyValue = 40 OrElse e.KeyValue = 38 OrElse e.KeyValue = 39 OrElse e.KeyValue = 37 Then
e.SuppressKeyPress = True
End If
End Sub
e.SuppressKeyPress = True
后,TileDropDown_KeyDown子例程将不会被调用。如果将其注释掉,则处理程序会被调用。 - Sukasa