키보드 키 이벤트를 수정하는 방법(Windows Forms .NET)

Windows Forms는 키보드 입력을 사용 및 수정할 수 있는 기능을 제공합니다. 키 사용은 메시지 큐 아래의 다른 메서드 및 이벤트가 키 값을 수신하지 않도록 메서드 또는 이벤트 처리기 내에서 키를 처리하는 것을 가리킵니다. 또한 키 수정은 메시지 큐 아래의 메서드 및 이벤트 처리기가 다른 키 값을 수신하도록 키 값을 수정하는 것을 가리킵니다. 이 문서에서는 관련 작업을 수행하는 방법을 보여 줍니다.

중요

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

키 사용

KeyPress 이벤트 처리기에서 KeyPressEventArgs 클래스의 Handled 속성을 true로 설정합니다.

또는

KeyDown 이벤트 처리기에서 KeyEventArgs 클래스의 Handled 속성을 true로 설정합니다.

참고

KeyDown 이벤트 처리기에서 Handled 속성을 설정해도 KeyPressKeyUp 이벤트가 현재 키 입력에 대해 발생하지 않도록 차단되지는 않습니다. 이렇게 하려면 SuppressKeyPress 속성을 사용합니다.

다음 예제에서는 KeyPress 이벤트를 처리하여 Aa 문자 키를 사용합니다. 해당 키는 텍스트 상자에 입력할 수 없습니다.

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a' || e.KeyChar == 'A')
        e.Handled = true;
}
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
    If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
        e.Handled = True
    End If
End Sub

표준 문자 키 수정

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

다음 예제에서는 KeyPress 이벤트를 처리하여 Aa 문자 키를 !로 변경합니다.

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a' || e.KeyChar == 'A')
    {
        e.KeyChar = '!';
        e.Handled = false;
    }
}
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs)
    If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
        e.KeyChar = "!"c
        e.Handled = False
    End If
End Sub

문자가 아닌 키 수정

컨트롤에서 상속하고 PreProcessMessage 메서드를 재정의하여 문자가 아닌 키 누름만 수정할 수 있습니다. 입력 Message는 컨트롤에 전송될 때 이벤트를 발생시키는 컨트롤 전에 처리됩니다. 해당 메시지를 가로채서 수정하거나 차단할 수 있습니다.

다음 코드 예제에서는 Message 매개 변수의 WParam 속성을 사용하여 누른 키를 변경하는 방법을 보여 줍니다. 이 코드는 F1~F10 키를 검색하고 해당 키를 0~9 범위의 숫자 키로 변환합니다(여기서 F10 키는 0에 매핑됨).

public override bool PreProcessMessage(ref Message m)
{
    const int WM_KEYDOWN = 0x100;

    if (m.Msg == WM_KEYDOWN)
    {
        Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

        // Detect F1 through F9.
        m.WParam = keyCode switch
        {
            Keys.F1 => (IntPtr)Keys.D1,
            Keys.F2 => (IntPtr)Keys.D2,
            Keys.F3 => (IntPtr)Keys.D3,
            Keys.F4 => (IntPtr)Keys.D4,
            Keys.F5 => (IntPtr)Keys.D5,
            Keys.F6 => (IntPtr)Keys.D6,
            Keys.F7 => (IntPtr)Keys.D7,
            Keys.F8 => (IntPtr)Keys.D8,
            Keys.F9 => (IntPtr)Keys.D9,
            Keys.F10 => (IntPtr)Keys.D0,
            _ => m.WParam
        };
    }

    // Send all other messages to the base method.
    return base.PreProcessMessage(ref m);
}
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean

    Const WM_KEYDOWN = &H100

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

        Select Case keyCode
            Case Keys.F1 : m.WParam = CType(Keys.D1, IntPtr)
            Case Keys.F2 : m.WParam = CType(Keys.D2, IntPtr)
            Case Keys.F3 : m.WParam = CType(Keys.D3, IntPtr)
            Case Keys.F4 : m.WParam = CType(Keys.D4, IntPtr)
            Case Keys.F5 : m.WParam = CType(Keys.D5, IntPtr)
            Case Keys.F6 : m.WParam = CType(Keys.D6, IntPtr)
            Case Keys.F7 : m.WParam = CType(Keys.D7, IntPtr)
            Case Keys.F8 : m.WParam = CType(Keys.D8, IntPtr)
            Case Keys.F9 : m.WParam = CType(Keys.D9, IntPtr)
            Case Keys.F10 : m.WParam = CType(Keys.D0, IntPtr)
        End Select
    End If

    Return MyBase.PreProcessMessage(m)
End Function

참고 항목