VB.NET 2008/VB - 폼(Form)

Windows Forms - 키보드 입력

본클라쓰 2011. 4. 10. 09:35

 

Windows Forms에서는 Windows 메시지에 대한 응답으로 키보드 이벤트를 발생시켜 키보드 입력을 처리한다. 대부분의 Windows Form 응용 프로그램에서 키보드 이벤트를 처리하여 키보드 입력을 단독으로 처리한다. 그러나 키가 컨트롤에 도달하기 전에 키를 가로채는 등의 고급 키보드 입력 시나리오를 구현하려면 키보드 메시지가 작동하는 방식을 알아야 한다.

 

 

Windows Forms에서는 키보드 입력을 비트 Keys 열거형으로 나타내는 가상 키 코드로 식별한다. Keys 열거형을 사용하면 눌려진 일련의 키를 결합하여 단일 값을 만들 수 있다. 이러한 값은 WM_KETDOWN 및 WM_SYSKEYDOWN Windows 메시지와 함께 제공되는 값에 해당한다. KeyDown 또는 KeyUp 이벤트를 처리하여 실제로 눌려진 키를 대부분 감지할 수 있다.

 

문자 키는 Keys 열거형의 하위 집합이며 WM_CHAR 및 WM_SYSCHAR Windows 메시지와 함게 제공되는 값에 해당한다. 눌려진 키를 결합하여 문자가 만들어지는 경우에는 KeyPress 이벤트를 처리하여 해당 문자를 감지할 수 있다. 또는 Visual Basic 프로그래밍 인터페이스에서 노출되는 Keyboard 를 사용하여 눌려진 키를 확인하고 키를 보낼 수 있다.

 

 

키보드의 이벤트 순서는 세 가지이다.

 

1. 사용자가 "a" 키를 누르면 해당 키가 전처리되고 디스패치된 다음 KeyDown 이벤트가 발생된다.

2. 사용자가 "a" 키를 누르고 있으면 해당 키가 전처리되고 디스패치된 다음 KeyPress 이벤트가 발생된다.

3. 사용자가 "a" 키를 놓으면 해당 키가 전처리되고 디스패치된 다음 KeyUp 이벤트가 발생된다.

 

 

다른 메시지와 마찬가지로 키보드 메시지는 폼이나 컨트롤의 WndProc 메서드에서 처리된다. 그러나 키보드 메시지를 처리하기 전에 PreProcessMessage 메서도는 특수 문자 키와 실제 키를 처리하도록 재정의할 수 있는 메서드를 하나 이상 호출한다. 이러한 메서드를 재정의하여 컨트롤에서 메시지를 처리하기 전에 특정 키를 감지하고 필터링할 수 있다.

 

 

Windows Forms에서는 다음과 같이 사용자가 키보드 키를 누를 때 발생하는 두 가지 이벤트와 사용자가 키보드 키를 놓았을 때 발생하는 한 가지 이벤트를 제공한다.

 

- 한 번 발생하는 KeyDown 이벤트

- 사용자가 동일한 키를 누르고 있을 때 여러 번 발생할 수 있는 KeyPress 이벤트

- 사용자가 키를 놓을 때 한 번 발생하는 KeyUp 이벤트

 

사용자가 키를 누르면 Windows Forms에서는 키보드 메시지가 문자 키를 지정하는지, 아니면 실제 키를 지정하는지 여부에 따라 발생시킬 이벤트를 결정한다.

 

 

Windows Forms에는 키보드 입력을 사용하고 수정할 수있는 기능이 있다. 키를 사용한다는 것은 메서드나 이벤트 처리기에서 메시지 큐 아래의 다른 메서드와 아벤트가 키 값을 받지 못하도록 키를 처리하는 것을 의미한다. 키를 수정한다는 것은 메시지 큐 아래의 메서드와 이벤트 처리기가 다른 키 값을 받도록 키의 값을 수정하는 것을 의미한다.

 

KeyPress 이벤트 처리기에서 KeyPressEventArgs 클래스의 handled 속성을 true로 설정하거나 KeyDown 이벤트 처리기에서 keyEventArgs 클래스의 Handled 속성을 true로 설정한다.  

 

다음 예제는 KeyPress 이벤트 처리기에서 받은 KeyPressEventArgs의 KeyChar 속성을 검사하는 switch 문을 인용한 코드이다. 이 코드에서는 'A' 및 'a' 문자 키를 사용한다.

 

' Consume 'A' and 'a'

Case ChaW(65), ChrW(97)

    MessageBox.Show("Contro.keyPress: " & e.KeyChar.ToString() & " consumed.")

    e.Handled = True

 

 

또한, 표준 문자 키를 수정하려면

 

KeyPress 이벤트 처리기에서 KeyPressEventArgs 클래스의 KeyChar 속성을 새 문자 키 값으로 설정한다.

 

다음 예제는 'B'를 'A'로 수정하고 'b'는 'a'로 수정하는 switch 문을 인용한 코드이다. 새 키 값이 메시지 규의 다른 메서드와 이벤트에 전파될 수 있도록 KeyPressEventArgs 매개 변수의 Handled 속성이 false로 설정한다.

 

' Modify 'B' to 'A' and forward the key.

Case ChrW(66)

    MessageBox.Show("Control.KeyPress: " & e.KeyChar.ToString() + " replaced by 'A'.")

    e.KeyChar = ChrW(65)

    e.Handled = False

 

' Modify 'b' to 'a' and forware the key.

Case ChrW(98)

    MessageBox.Show("Control.KeyPress: " & e.KeyChar.ToString() + " replaced by 'a'.")

    e.KeyChar = ChrW(97)

    e.Handled = False

 

 

 

비문자 키를 수정하려면 Windows 메시지를 처리하는 Control 메서드를 재정의하고, WM_KEYDOWN 또는 WM_SYSKEYDOWN 메시지를 감지한 다음 Message 매개 변수의 WParam 속성을 새 비문자키르르 나타내는 Keys 값으로 설정할 수 있다.

 

다음 코드는 컨트롤의 PressProcessMessage 메서드를 재정의하여 F1-F9 키를 감지하고 F3 키 누르기를 모두 F1 키로 수정하는 방법을 보여준다.

 

' Detect F1 through F9 during preprocessing and modify F3.
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean

    If m.Msg = WM_KEYDOWN Then
        Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode

        ' Detect F1 through F9.
        Select Case keyCode
            Case Keys.F1, Keys.F2, Keys.F3, Keys.F4, Keys.F5, Keys.F6, Keys.F7, Keys.F8, Keys.F9

                MessageBox.Show(("Control.PreProcessMessage: '" & keyCode.ToString() & "' pressed."))

                ' Replace F3 with F1, so that ProcessKeyMessage will 
                ' receive F1 instead of F3.
                If keyCode = Keys.F3 Then
                    m.WParam = CType(Keys.F1, IntPtr)
                    MessageBox.Show(("Control.PreProcessMessage: '" & keyCode.ToString() & "' replaced by F1."))
                End If
        End Select
    End If

    ' Send all other messages to the base method.
    Return MyBase.PreProcessMessage(m)
End Function

 

 

사용자의 키 입력을 받아들이는 응용 프로그램을 만들 때 shift, Alt 및 Ctrl 키와 같은 보조키를 모니터링 할 필요가 있다. 보조키를 다른 키 또는 마우스 클릭과 함께 누르면 응용 프로그램에서 적절하게 응답할 수 있다. 예를 들어, S 문자를 누르면 화면에 'S'자가 나타나지만 Ctrl + S 를 누르면 현재 문서가 저장된다. KeyDown 이벤트를 처리하면 이벤트 처리기가 받은 KeyEventArgs의 Modifiers 속성에 따라 누르는 보조키가 지정된다. 또는 KeyEventArgs의 KeyData 속성에 따라 누르는 문자 및 비트 OR와 함께 사용할 보조키가 지정된다.

 

그러나 KeyPress 이벤트 또는 마우스 이벤트를 처리할 경우 이벤트 처리기에서 이 정보를 받지 않는다. 이 경우에는 Control 클래스의 ModifierKeys 속성을 사용해야 한다. 어떤 경우든 적절한 Keys 값과 테스트할 값의 비트 AND를 수행한다. Keys 열거형에서는 변형된 보조키를 각각 제공하므로 올바른 값과 비트 AND를 수행하는 것이 중요하다. 예를 들어, Shift, shiftKey, RshiftKey, LShiftKey로 표시되며, Shift 키를 보조키로 테스트할 올바른 값은 shift 이다.

 

Public Sub TextBox1_KeyPress(ByVal sender As ObjectByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress

    If ((Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then
        MsgBox("Pressed " + Keys.Shift.ToString())
    End If
End Sub

 

 

 

 

 

'VB.NET 2008 > VB - 폼(Form)' 카테고리의 다른 글

Windows Forms - 대화 상자  (0) 2011.04.10
Windows Forms - 마우스 입력  (0) 2011.04.10
Windows Forms - 이벤트  (0) 2011.04.10
Windows Forms - 모양 변경  (0) 2011.04.10
Windows Forms - 자동 배율 조정  (0) 2011.04.10