2011-01-08 2 views
0

코드 :한 KeyEvents는 CTRL과 함께 작동

Private Sub KeyHandling(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
    Select Case e.KeyCode 
     Case Keys.Left 
     btnPrev.PerformClick() 
     Case Keys.Right 
     btnNext.PerformClick() 
     Case Keys.Up 
     btnFirst.PerformClick() 
     Case Keys.Down 
     btnLast.PerformClick() 
    End Select 
End Sub 

내 양식의 KeyPreview 속성을 사용할 수 있습니다.

문제 :이 코드는 내가 컨트롤 키를 누른 경우를 제외하고 아무것도하지 않습니다

. 아무도 이것을 설명 할 수 있습니까? :)

답변

0

커서 키가 KeyDown 이벤트가 시작되기 전에 조기에 가로 채기 때문입니다. Winforms는 Tab과 마찬가지로 포커스를 이동하는 데이를 사용합니다. Ctrl 키를 누르고 있으면 더 이상 탐색 키가 아니며 KeyDown 이벤트에서 Ctrl 키를 볼 수 있습니다.

일반적으로 IsInputKey()를 재정 의하여이를 수정하지만 폼에 컨트롤이 있으면 작동하지 않습니다. KeyPreview를 true로 설정하면 아마 수행됩니다. 양식은 결코 초점을 얻지 못합니다. KeyPreview를 포기할 필요가 있습니다. 이전의 VB6 시대 착오적 이라기보다는 ProcessCmdKey()를 재정 의하여 커서 키를 잡습니다. 이와 같이하면 :

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean 
    If keyData = Keys.Left Then 
     Console.WriteLine("left") 
     Return True 
    End If 
    Return MyBase.ProcessCmdKey(msg, keyData) 
End Function 
0

귀하의 양식에 버튼이 있다고 가정합니다. 버튼에 포커스가 있으면 사용자는 폼의 버튼 사이에있는 화살표 버튼을 사용하여 포커스를 변경할 수 있습니다. 이것이 화살표 키를 누를 때 버튼이 KeyDown 이벤트를 수신하지 못하는 이유입니다.

다음 트릭을 따르면이 문제를 방지하는 데 도움이됩니다. 모든 버튼의 양식에서 다음에 PreviewKeyDown 이벤트를 설정합니다

화살표 키를 많이 키와 같은 형태의 컨트롤을 탐색하는 것이 무엇 일어나고
Private Sub Button1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Button1.PreviewKeyDown 
     e.IsInputKey = True 
End Sub 
+0

이 방법이 효과적 일 수 있지만 가능한 경우 컨테이너 컨트롤의 상위 수준에서 처리해야합니다. 훨씬 더 우아하고 관리하기 쉬운 코드를 만듭니다. –

0

. 화살표 키를 누를 때마다 현재 활성화 된 컨트롤에서 화살표 키와 같은 상대적 방향으로 포커스가 다음 컨트롤로 이동합니다.

이 화살표 키 해석은 처리중인 양식의 KeyDown 이벤트보다 상위 레벨에서 구현됩니다. 각 키 누름은 ProcessDialogKey function에 의해 실제로 소비되고 있으므로 키 이벤트가 이후 처리를 위해 KeyHandling 방법으로 전달되는 것을 방지합니다.

Ctrl 키 키를 누르고 있으면 예상대로 모든 것이 작동하는지 이유

ProcessDialogKey 기능이 그들을 이벤트 처리기 메서드에 전달 될 수 있도록 이러한 이벤트를 소비하지 않습니다. 메서드의 documentation은 다음과 같이 알려줍니다.

이 메서드는 ALT 또는 CONTROL 한정자가 포함 된 키 입력을 처리하지 않습니다. 화살표 키는 사용자의 컨트롤 사이 만 적절하게 이름의 버튼을 '클릭'으로 이동하지 않으려면


솔루션은 명백해야한다 : 당신은, 당신을 추가 ProcessDialogKey 메소드를 오버라이드 (override) 할 필요가 사용자 지정 키 처리 논리를 사용하고 사용자가 직접 키를 처리했음을 나타내는 "True"값을 반환합니다. 그렇지 않으면 기본 클래스로 전화하여 과 같은 표준 처리를 방해하지 않게합니다. Tab을 입력합니다. 다시, documentation 여기 상쾌 분명하다

파생 클래스에서 ProcessDialogKey 방법을 무시하고 컨트롤이이 키를 처리 한 것을 나타 내기 위해서 true를 반환해야합니다. 컨트롤에 의해 처리되지 않은 키의 경우 기본 클래스의 ProcessDialogChar 메서드를 호출 한 결과가 반환되어야합니다.

단순히 양식에 다음 코드를 추가하고, KeyHandling 방법을 제거 당신은 지금이 :

Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean 
    Select Case keyData 
     Case Keys.Left 
      btnPrev.PerformClick() 
      Return True 
     Case Keys.Right 
      btnNext.PerformClick() 
      Return True 
     Case Keys.Up 
      btnFirst.PerformClick() 
      Return True 
     Case Keys.Down 
      btnLast.PerformClick() 
      Return True 
    End Select 

    Return MyBase.ProcessDialogKey(keyData) 
End Function 
+0

위대한 설명! 고맙습니다. – Jeroen

0

당신은 훨씬 더 많은 정보를 제공해야합니다.

이벤트를 어떤 형식으로 처리하는지 알기 시작합니다. 비표준 핸들러 이름을 가진 핸들러를 보여 주지만 연관된 이벤트를 표시하지는 않습니다. 어떻게 그 사건을 사건과 관련 짓습니까?

폼 디자이너에서 속성 창에서 이벤트 탭을보십시오. KeyDown 또는 KeyPress 아래에 물건이 있습니까? 그것이 필요한 곳입니다.

둘째, 키보드 이벤트를 구성하기 위해 연결되어 있지 않거나 실행되기 때문에 아무 것도하지 않으려 고하지만 원하는대로 할 수 없습니까? 중단 점을 설정하십시오. 코드가 호출됩니까?

위 질문에 대한 대답에 따라 검색하려는 문자에 따라 KeyDown 또는 KeyPress 이벤트를 전환해야 할 수 있습니다.

+0

메시지를 보려면 스크롤해야하지만 메서드 선언의 끝에서 처리 할 이벤트가 무엇인지 알려줍니다 : 'Handles Me.KeyDown'. 이미 그 방법에 맞게 적절히 배선되어 있습니다. 태그를 확인해야합니다. 이것은 C#이 아닙니다. –

+0

@ 코드 : 아, 예, 저는 C#을 익숙하게 사용하고 오른쪽으로 스크롤하지 않았습니다. 감사. –

관련 문제