2009-10-22 87 views
6

我已经有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 
+0

在控制的忽略它,看看它是否触发至少一次 – curtisk 2009-10-22 17:20:53

+0

随着'在e.SuppressKeyPress = TRUE;未注释的代码中设置断点frmMain KeyDown处理函数,TileDropDown_KeyDown子例程永远不会被调用。随着它的评论,处理程序*被称为。 – Sukasa 2009-10-22 17:54:27

回答

8

截距在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

相关问题