키보드 사용 개요(Windows Forms .NET)

Windows Forms에서 사용자 입력은 Windows 메시지 형식으로 애플리케이션에 전송됩니다. 일련의 재정의 가능한 메서드는 애플리케이션, 양식 및 컨트롤 수준에서 해당 메시지를 처리합니다. 해당 메서드는 키보드 메시지를 수신하면 처리할 수 있는 이벤트를 발생시켜 키보드 입력 정보를 가져옵니다. 대부분의 경우 Windows Forms 애플리케이션은 해당 이벤트를 처리하여 모든 사용자 입력을 처리할 수 있습니다. 다른 경우에는 애플리케이션, 양식 또는 컨트롤이 메시지를 수신하기 전에 특정 메시지를 가로채기 위해 애플리케이션이 메시지를 처리하는 메서드 중 하나를 재정의해야 할 수 있습니다.

중요

.NET 7 및 .NET 6에 관한 데스크톱 가이드 설명서는 제작 중입니다.

키보드 이벤트

모든 Windows Forms 컨트롤은 마우스 및 키보드 입력과 관련된 이벤트 세트를 상속합니다. 예를 들어 컨트롤은 KeyPress 이벤트를 처리하여 누른 키의 문자 코드를 확인할 수 있습니다. 자세한 내용은 키보드 이벤트 사용을 참조하세요.

사용자 입력 메시지를 처리하는 메서드

양식 및 컨트롤은 메시지 큐의 서로 다른 지점에서 Windows 메시지를 처리하는 재정의 가능한 메서드 세트와 IMessageFilter 인터페이스에 액세스할 수 있습니다. 해당 메서드에는 모두 Windows 메시지의 하위 수준 세부 정보를 캡슐화하는 Message 매개 변수가 있습니다. 해당 메서드를 구현하거나 재정의하여 메시지를 검사한 다음, 메시지를 사용하거나 메시지 큐로 다음 소비자에게 전달할 수 있습니다. 다음 표는 Windows Forms의 모든 Windows 메시지를 처리하는 메서드를 제공합니다.

메서드 참고
PreFilterMessage 이 메서드는 애플리케이션 수준에서 큐에 있는(게시된) Windows 메시지를 가로챕니다.
PreProcessMessage 이 메서드는 처리되기 전에 양식 및 컨트롤 수준에서 Windows 메시지를 가로챕니다.
WndProc 이 메서드는 양식 및 컨트롤 수준에서 Windows 메시지를 처리합니다.
DefWndProc 이 메서드는 양식 및 컨트롤 수준에서 Windows 메시지의 기본 처리를 수행합니다. 창의 최소 기능을 제공합니다.
OnNotifyMessage 이 메서드는 처리된 후 양식 및 컨트롤 수준에서 메시지를 가로챕니다. 해당 메서드를 호출하려면 EnableNotifyMessage 스타일 비트를 설정해야 합니다.

키보드 및 마우스 메시지는 해당 메시지 형식과 관련된 재정의 가능한 추가 메서드 세트에서 처리됩니다. 자세한 내용은 키 전처리 섹션을 참조하세요. .

키의 유형

Windows Forms는 키보드 입력을 비트 Keys 열거형으로 나타내는 가상 키 코드로 식별합니다. Keys 열거형을 사용하면 일련의 누른 키를 결합하여 단일 값을 만들 수 있습니다. 해당 값은 WM_KEYDOWNWM_SYSKEYDOWN Windows 메시지와 함께 제공되는 값에 해당합니다. KeyDown 또는 KeyUp 이벤트를 처리하여 대부분의 물리적 키 누름을 검색할 수 있습니다. 문자 키는 Keys 열거형의 하위 집합이며 WM_CHARWM_SYSCHAR Windows 메시지와 함께 제공되는 값에 해당합니다. 누른 키를 결합하여 문자가 만들어지는 경우에는 KeyPress 이벤트를 처리하여 해당 문자를 검색할 수 있습니다.

키보드 이벤트의 순서

앞에서 설명한 대로 한 컨트롤에서 발생할 수 있는 키보드 관련 이벤트는 세 가지입니다. 다음 시퀀스는 키보드 이벤트의 일반적인 순서를 보여 줍니다.

  1. 사용자가 “a” 키를 누르면 해당 키가 전처리되고, 디스패치된 다음, KeyDown 이벤트가 발생합니다.
  2. 사용자가 “a” 키를 누르고 있으면 해당 키가 전처리되고, 디스패치된 다음, KeyPress 이벤트가 발생합니다. 이 이벤트는 사용자가 키를 누르고 있을 때 여러 차례 발생합니다.
  3. 사용자가 “a” 키를 놓으면 해당 키가 전처리되고, 디스패치된 다음, KeyUp 이벤트가 발생합니다.

키 전처리

다른 메시지와 마찬가지로 키보드 메시지는 양식이나 컨트롤의 WndProc 메서드에서 처리됩니다. 그러나 키보드 메시지를 처리하기 전에 PreProcessMessage 메서드는 특수 문자 키와 실제 키를 처리하도록 재정의할 수 있는 메서드를 하나 이상 호출합니다. 이러한 메서드를 재정의하여 컨트롤에서 메시지를 처리하기 전에 특정 키를 감지하고 필터링할 수 있습니다. 다음 표에서는 수행할 작업과 이와 관련하여 발생하는 메서드를 메서드 발생 순서에 따라 보여 줍니다.

KeyDown 이벤트의 전처리

작업 관련 메서드 참고
액셀러레이터 키나 메뉴 바로 가기 같은 명령 키를 확인합니다. ProcessCmdKey 이 메서드는 일반 키보다 우선되는 명령 키를 처리합니다. 이 메서드가 true를 반환하는 경우 키 메시지가 디스패치되지 않고 키 이벤트도 발생하지 않습니다. false를 반환하는 경우 IsInputKey가 호출됩니다.
전처리가 필요한 특수 키인지 아니면 KeyDown 이벤트를 발생시켜 컨트롤에 디스패치해야 하는 일반 문자 키인지 확인합니다. IsInputKey 이 메서드가 true를 반환하는 경우에는 컨트롤이 일반 문자이고 KeyDown 이벤트가 발생합니다. false인 경우 ProcessDialogKey가 호출됩니다. 참고: 컨트롤이 키 또는 키 조합을 가져오는지 확인하기 위해 PreviewKeyDown 이벤트를 처리하고 원하는 키에 대해 PreviewKeyDownEventArgsIsInputKeytrue로 설정할 수 있습니다.
탐색 키(Esc, Tab, Enter 또는 화살표 키)를 확인합니다. ProcessDialogKey 이 메서드는 컨트롤 내에서 컨트롤과 부모 컨트롤 간의 포커스 전환과 같은 특수 기능을 담당하는 실제 키를 처리합니다. 현재 컨트롤에서 키를 처리하지 않으면 ProcessDialogKey가 부모 컨트롤에서 호출되고 계층 구조의 최상위 컨트롤까지 이와 같은 호출 방식을 계속 적용합니다. 이 메서드에서 true를 반환하면 전처리는 완료되지만 키 이벤트는 생성되지 않습니다. false를 반환하는 경우 KeyDown 이벤트가 발생합니다.

KeyPress 이벤트의 전처리

작업 관련 메서드 참고
키가 컨트롤에서 전처리되어야 하는 일반 문자인지 여부를 확인합니다. IsInputChar 문자가 일반 문자인 경우 이 메서드는 true를 반환하고 KeyPress 이벤트가 발생하지만 추가적인 전처리 작업은 발생하지 않습니다. 그렇지 않으면 ProcessDialogChar이 호출됩니다.
문자가 단추의 &OK와 같은 니모닉인지 확인하려면 선택합니다. ProcessDialogChar ProcessDialogKey와 비슷한 이 메서드는 컨트롤 계층 구조를 올라가며 호출됩니다. 컨트롤이 컨테이너 컨트롤인 경우 이 메서드는 컨트롤과 그 자식 컨트롤에 대해 ProcessMnemonic을 호출하여 니모닉을 확인합니다. ProcessDialogChartrue를 반환하는 경우에는 KeyPress 이벤트가 발생하지 않습니다.

키보드 메시지 전처리

양식이나 컨트롤의 WndProc 메서드에 도달한 키보드 메시지는 재정의할 수 있는 메서드 세트에서 처리됩니다. 해당 메서드는 각각 키보드 메시지가 처리되어 컨트롤에서 사용되었는지를 지정하는 Boolean 값을 반환합니다. 이러한 메서드 중 한 메서드에서 true를 반환하면 메시지가 처리된 것으로 간주됩니다. 그러므로 컨트롤의 기본 또는 부모에 추가 처리를 위한 메시지를 전달하지 않습니다. 그렇지 않은 경우에는 메시지가 메시지 큐에 유지되고 컨트롤의 기본 또는 부모의 다른 메서드에서 처리됩니다. 다음 표에서는 키보드 메시지를 처리하는 메서드를 보여 줍니다.

메서드 참고
ProcessKeyMessage 이 메서드는 컨트롤의 WndProc 메서드에서 받은 모든 키보드 메시지를 처리합니다.
ProcessKeyPreview 이 메서드는 키보드 메시지를 컨트롤의 부모에 보냅니다. ProcessKeyPreviewtrue를 반환하는 경우 키 이벤트가 생성되지 않습니다. 이외의 경우에는 ProcessKeyEventArgs가 호출됩니다.
ProcessKeyEventArgs 이 메서드는 KeyDown, KeyPressKeyUp 이벤트를 적절하게 발생시킵니다.

키보드 메서드 재정의

키보드 메시지를 전처리하고 처리할 때 재정의할 수 있는 여러 가지 메서드가 있지만 그중 다음과 같은 메서드가 특히 많이 사용됩니다. 다음 표에서는 수행할 작업과 키보드 메서드를 재정의할 수 있는 가장 좋은 방법을 보여 줍니다. 메서드 재정의에 관한 자세한 내용은 상속(C# 프로그래밍 가이드) 또는 상속(Visual Basic)을 참조하세요.

작업 메서드
탐색 키를 가로채고 KeyDown 이벤트를 발생시킵니다. Tab 키와 Enter 키를 텍스트 상자에서 처리하려는 경우를 예를 들어보겠습니다. IsInputKey를 재정의합니다. 참고: 또는 PreviewKeyDown 이벤트를 처리하고 원하는 키에 대해 PreviewKeyDownEventArgsIsInputKeytrue로 설정할 수 있습니다.
컨트롤에서 특수 입력 키나 탐색 키에 대한 처리를 수행합니다. 예를 들어 목록 컨트롤에서 화살표 키를 사용하여 선택한 항목을 변경할 수 있습니다. ProcessDialogKey를 재정의합니다.
탐색 키를 가로채고 KeyPress 이벤트를 발생시킵니다. 예를 들어 스핀 상자 컨트롤에서 화살표 키를 여러 차례 눌러 항목 전체를 빠르게 진행할 수 있습니다. IsInputChar를 재정의합니다.
KeyPress 이벤트 중에 특수 입력 또는 탐색 처리를 수행합니다. 예를 들어, 목록 컨트롤에서 "r" 키를 누른 채로 r 문자로 시작하는 항목 사이를 건너뛸 수 있습니다. ProcessDialogChar를 재정의합니다.
사용자 지정 니모닉 처리를 수행합니다. 예를 들어 도구 모음에 포함된, 소유자가 그린 단추의 니모닉을 처리할 수 있습니다. ProcessMnemonic를 재정의합니다.

참고 항목