mam jużKeyPreview
wartość true w właściwości formularzaZdarzenie KeyDown nie jest uruchamiane przy użyciu programu .NET WinForms?
pracuję nad małym programem, i mam problem, gdzie wydaje się, że niektóre z kontrolami na nim są wewnątrz groupboxes nie wyzwalanie zdarzenia KeyDown w moim formularzu po naciśnięciu i zwolnieniu dowolnego klawisza ze strzałką, tylko zdarzenie KeyUp. Czy coś jest nie tak z moim kodem, który może być przyczyną tego?
W szczególności włączyłem KeyPreview w formularzu i ustawiłem punkty przerwania na e.SuppressKeyPress = True
w obu podprogramach, a tylko ten dla frmMain_KeyUp trafił w punkt przerwania.
Dodałem w dwóch zdarzeniach GroupBox, mając nadzieję, że może to złagodzić problem, ale bez takiego szczęścia. Mam jednak niestandardową kontrolę nad formularzem, który jest specjalnie zakodowany, aby zignorować te klawisze, a kod działa zgodnie z oczekiwaniami.
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
Kod w kontroli użytkownika, które „ignoruje” naciśnięć klawiszy jest jako takie:
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
ustawić punkt przerwania w kodzie sterowania, który ignoruje go i zobacz czy odpala przynajmniej raz – curtisk
Z 'e.SuppressKeyPress = TRUE odkomentowane w frmMain KeyDown handler, podprogram TileDropDown_KeyDown nigdy nie jest wywoływany. Po skomentowaniu, program obsługi * jest * wywoływany. – Sukasa