Событие KeyDown не запускается с .NET WinForms? - PullRequest
7 голосов
/ 22 октября 2009

У меня уже есть KeyPreview , установленной в true в свойствах формы

Я работаю над небольшой программой, и у меня возникает проблема, когда кажется, что некоторые элементы управления внутри групповых блоков не вызывают событие 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

Ответы [ 2 ]

9 голосов
/ 24 октября 2009

Некоторые элементы управления перехватывают клавиши со стрелками в событии 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 голосов
/ 28 июля 2018

Не нужно так много делать, просто используйте Me.KeyPreview = True в функции загрузки и используйте (Handles Me.KeyUp) в функции Target для vb.net для клавиш со стрелками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...