언어

양식에서 키보드 입력 메시지를 처리하는 방법

Windows Forms에서는 메시지가 컨트롤에 도달하기 전에 폼 수준에서 키보드 메시지를 처리하는 기능을 제공합니다. 이 문서에서는 해당 작업을 수행하는 방법을 보여 줍니다.

키보드 메시지 처리

활성 양식의 KeyPress 또는 KeyDown 이벤트를 처리하고 양식의 KeyPreview 속성을 true로 설정합니다. 이 속성을 사용하면 폼의 컨트롤에 도달하기 전에 키보드 입력이 폼에 도달합니다. 다음 코드 예제에서는 모든 숫자 키를 감지하고 1, 4, 7을 소비하여 KeyPress 이벤트를 처리합니다.

// Detect all numeric characters at the form level and consume 1, 4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (char.IsDigit(e.KeyChar))
    {
        MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");

        switch (e.KeyChar)
        {
            case '1':
            case '4':
            case '7':
                MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
                e.Handled = true;
                break;
        }
    }
}
' Detect all numeric characters at the form level and consume 1, 4, and 7.
' Form.KeyPreview must be set to true for this event handler to be called.
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs)
    If Char.IsDigit(e.KeyChar) Then
        MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.")

        Select Case e.KeyChar
            Case "1"c, "4"c, "7"c
                MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.")
                e.Handled = True
        End Select
    End If

End Sub

KeyPreview만으로는 충분하지 않을 때

설정 Form.KeyPreview = true 은 모든 키가 양식 수준 이벤트 처리기에 도달한다는 것을 보장하지 않습니다. 특정 키는 표준 양식 이벤트가 실행되기 전에 전처리를 거행합니다. 이러한 예외를 이해하는 것은 명령 키, 대화 상자 키 및 컨트롤 관련 입력을 올바르게 처리하는 데 중요합니다.

명령 및 대화 상자 키 전처리

양식 수준 키보드 이벤트가 발생하기 전에 Windows 이러한 메서드를 통해 특정 키를 순서대로 전처리합니다.

  1. ProcessCmdKey: 메뉴 바로 가기 및 가속기와 같은 명령 키를 가로챌 수 있습니다. 이 메서드가 반환 true되면 키가 사용되며 이벤트가 발생하지 않습니다.
  2. IsInputKey: 키가 KeyDown 이벤트를 발생시켜야 하는지 아니면 ProcessDialogKey로 이동해야 하는지를 결정합니다.
  3. ProcessDialogKey: 탐색 키(이스케이프, 탭, 반환 및 화살표 키)를 처리합니다. 처리된 경우 이벤트가 발생하지 않습니다.

현재 포커스된 컨트롤이 전처리 단계에서 키 입력을 소비하면, KeyPreview와 관계없이 폼은 해당 키를 받지 못합니다.

양식 수준 처리기를 우회하는 특수 사례

  • EnterEscape: 이러한 키는 AcceptButton 양식 이벤트에 도달하기 전과 CancelButton 그 전에 처리될 수 있습니다.
  • : 컨트롤 포커스 관리에서 자주 사용되며 양식 처리기에 도달하지 않습니다.
  • 메뉴 바로 가기: Alt 키 조합은 메뉴 전처리에 의해 처리됩니다.

폼 수준에서 명령 키 가로채기

폼 수준에서 명령 키(메뉴 바로 가기 키 및 대화 상자 키 포함)를 처리하려면 폼에서 ProcessCmdKey를 재정의합니다. 이는 전처리 중에 표준 양식 이벤트 전에 실행됩니다.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // Intercept Ctrl+A for custom handling
    if (keyData == (Keys.Control | Keys.A))
    {
        MessageBox.Show("Ctrl+A intercepted at form level");
        return true; // Mark as handled
    }

    // Pass other keys to the base handler
    return base.ProcessCmdKey(ref msg, keyData);
}
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
    ' Intercept Ctrl+A for custom handling
    If keyData = (Keys.Control Or Keys.A) Then
        MessageBox.Show("Ctrl+A intercepted at form level")
        Return True ' Mark as handled
    End If

    ' Pass other keys to the base handler
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

특정 컨트롤에서 표준 이벤트를 발생시켜야 하는 키에는 해당 컨트롤에서 IsInputKeytrue로 설정한 PreviewKeyDown을 사용합니다.

참고하십시오