Dela via


Ändra tangentbordsnyckelhändelser (Windows Forms .NET)

Windows Forms ger möjlighet att använda och ändra tangentbordsindata. Användning av en nyckel syftar på hantering av en nyckel i en metod eller händelsehanterare så att andra metoder och händelser längre ned i meddelandekön inte får nyckelvärdet. Och att ändra en nyckel syftar på att ändra värdet för en nyckel så att metoder och händelsehanterare längre ned i meddelandekön får ett annat nyckelvärde. Den här artikeln visar hur du utför dessa uppgifter.

Använda en nyckel

I en KeyPress händelsehanterare anger du egenskapen Handled för klassen KeyPressEventArgs till true.

-eller-

I en KeyDown händelsehanterare anger du egenskapen Handled för klassen KeyEventArgs till true.

Not

Om du anger egenskapen Handled i händelsehanteraren för KeyDown hindrar det inte KeyPress och KeyUp händelser från att aktiveras för den aktuella tangenttryckningen. Använd egenskapen SuppressKeyPress för det här ändamålet.

I följande exempel behandlas KeyPress-händelsen för att konsumera A- och a-tecknen. Dessa nycklar kan inte skrivas in i textrutan:

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

Ändra en standardteckennyckel

I en KeyPress händelsehanterare anger du egenskapen KeyChar för klassen KeyPressEventArgs till värdet för den nya teckennyckeln.

I följande exempel hanteras KeyPress händelse för att ändra eventuella A- och a teckennycklar till !:

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

Ändra en nyckel som inte är tecken

Du kan bara ändra tangenttryckningar som inte är tecken genom att ärva från kontrollen och åsidosätta metoden PreProcessMessage. När indata Message skickas till kontrollen bearbetas den innan kontrollen initierar händelser. Du kan fånga upp dessa meddelanden för att ändra eller blockera dem.

Följande kodexempel visar hur du använder egenskapen WParam för parametern Message för att ändra tangenten som trycks in. Den här koden identifierar en nyckel från F1 via F10 och översätter nyckeln till en numerisk nyckel som sträcker sig från 0 till 9 (där F10 mappar till 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

Se även