KeyDown事件不能用.NET WinForms触发?
问题描述:
我已经有KeyPreview
设置为true的窗体属性KeyDown事件不能用.NET WinForms触发?
我工作的一个小程序,我在这里似乎有些控件在这里面groupboxes是一个问题当我按下并释放任何箭头键时,不会触发表单上的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
答
截距在keydown事件箭头键某些控件,但不是在keyup事件。一种解决方案是导出控制类并覆盖ProcessCmdKey:
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keydata As Keys) As Boolean
If keydata = Keys.Right Or keydata = Keys.Left Or keydata = Keys.Up Or keydata = Keys.Down Then
OnKeyDown(New KeyEventArgs(keydata))
ProcessCmdKey = True
Else
ProcessCmdKey = MyBase.ProcessCmdKey(msg, keydata)
End If
End Function
+0
这工作完美,谢谢! – Sukasa 2009-10-24 17:05:34
在控制的忽略它,看看它是否触发至少一次 – curtisk 2009-10-22 17:20:53
随着'在e.SuppressKeyPress = TRUE;未注释的代码中设置断点frmMain KeyDown处理函数,TileDropDown_KeyDown子例程永远不会被调用。随着它的评论,处理程序*被称为。 – Sukasa 2009-10-22 17:54:27