共用方式為


如何修改鍵盤按鍵事件 (Windows Forms .NET)

Windows Form 提供使用和修改鍵盤輸入的功能。 取用按鍵表示在方法或事件處理常式中處理按鍵,好讓訊息佇列較後面的其他方法和事件不會收到按鍵值。 而修改按鍵則表示修改按鍵的值,好讓訊息佇列較後面的方法和事件處理常式收到不同的按鍵值。 本文會説明如何完成這些工作。

取用按鍵

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 屬性來變更按下的按鍵。 此程式碼會偵測 F1F10 的按鍵,並將按鍵轉譯為範圍從 09 的數值按鍵 (其中 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

另請參閱