キーボード キー イベントを変更する方法 (Windows フォーム .NET)

Windows フォームは、キーボードの入力を使用して変更する機能を提供します。 キーの使用とは、メッセージ キューのさらに下のその他のメソッドとイベントが、キーの値を受信しないようにメソッドまたはイベント ハンドラー内のキーを処理することを表します。 また、キーの変更とは、メッセージ キューのさらに下のメソッドとイベント ハンドラーが、異なるキーの値を受け取るようにキーの値を変更することを表します。 この記事では、これらのタスクを実行する方法について説明します。

キーを使用する

KeyPress イベント ハンドラーで、KeyPressEventArgs クラスの Handled プロパティを true に設定します。

または

KeyDown イベント ハンドラーで、KeyEventArgs クラスの Handled プロパティを true に設定します。

注意

KeyDown イベント ハンドラーで Handled プロパティを設定すると、KeyPress イベントと KeyUp イベントが現在のキー入力から発生しないようにすることができます。 この目的には、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

関連項目