次の方法で共有


キーボード キー イベントを変更する方法 (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 イベントを処理して、A キーと a 文字キーを !に変更します。

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

関連項目