2009-10-22 35 views
6

Tôi đã cóKeyPreviewset là true trong các thuộc tính hình thứcSự kiện KeyDown không kích hoạt bằng .NET WinForms?

Tôi đang làm việc trên một chương trình nhỏ, và tôi đang gặp một vấn đề mà có vẻ như một số các điều khiển trên nó groupboxes bên trong là không kích hoạt sự kiện KeyDown trên biểu mẫu của tôi khi tôi nhấn và thả bất kỳ phím mũi tên nào, chỉ sự kiện KeyUp. Có gì sai với mã của tôi có thể gây ra điều này không?

Cụ thể, tôi đã bật KeyPreview trên biểu mẫu và đặt điểm ngắt trên e.SuppressKeyPress = True trong cả hai chương trình con và chỉ một điểm cho frmMain_KeyUp truy cập điểm ngắt.

Tôi đã thêm vào hai sự kiện GroupBox với hy vọng có thể giảm thiểu vấn đề, nhưng không có may mắn như vậy. Tuy nhiên, tôi có một điều khiển tùy chỉnh trên biểu mẫu được mã hóa cụ thể để bỏ qua các lần nhấn phím này và mã hoạt động như mong đợi trên đó.

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 

Mã trong việc kiểm soát người dùng mà "bỏ qua" bấm phím là như vậy:

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

thiết lập một breakpoint trong mã của điều khiển mà bỏ qua nó và xem nếu nó cháy ít nhất một lần – curtisk

+0

Với 'e.SuppressKeyPress = TRUE' không chú thích trong frmMain KeyDown handler, chương trình con TileDropDown_KeyDown không bao giờ được gọi. Với nó nhận xét, xử lý * được * gọi. – Sukasa

Trả lời

8

Một số điều khiển đánh chặn các phím mũi tên trong sự kiện KeyDown, nhưng không phải trong sự kiện KeyUp. Một giải pháp là để lấy được các lớp kiểm soát và ghi đè 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

Điều này làm việc một cách hoàn hảo, cảm ơn! – Sukasa

Các vấn đề liên quan