Bagikan melalui


Cara mengubah peristiwa kunci keyboard (Formulir Windows .NET)

Formulir Windows menyediakan kemampuan untuk menggunakan dan memodifikasi input keyboard. Menggunakan kunci mengacu pada penanganan kunci dalam metode atau penanganan aktivitas sehingga metode dan peristiwa lain lebih jauh ke bawah antrean pesan tidak menerima nilai kunci. Dan, memodifikasi kunci mengacu pada memodifikasi nilai kunci sehingga metode dan penanganan aktivitas lebih jauh ke bawah antrean pesan menerima nilai kunci yang berbeda. Artikel ini memperlihatkan cara menyelesaikan tugas-tugas ini.

Penting

Dokumentasi Panduan Desktop untuk .NET 7 dan .NET 6 sedang dibangun.

Mengonsumsi kunci

Dalam penanganan KeyPress aktivitas, atur Handled properti kelas ke KeyPressEventArgstrue.

-atau-

Dalam penanganan KeyDown aktivitas, atur Handled properti kelas ke KeyEventArgstrue.

Catatan

Handled Mengatur properti di KeyDown penanganan aktivitas tidak mencegah KeyPress peristiwa dan KeyUp dinaikkan untuk penekanan tombol saat ini. SuppressKeyPress Gunakan properti untuk tujuan ini.

Contoh berikut menangani KeyPress peristiwa untuk menggunakan A kunci karakter dan a . Kunci tersebut tidak dapat ditik ke dalam kotak teks:

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

Mengubah kunci karakter standar

Dalam penanganan KeyPress aktivitas, atur KeyChar properti KeyPressEventArgs kelas ke nilai kunci karakter baru.

Contoh berikut menangani KeyPress peristiwa untuk mengubah kunci karakter dan a apa pun A menjadi !:

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

Mengubah kunci non-karakter

Anda hanya dapat memodifikasi penekanan tombol non-karakter dengan mewarisi dari kontrol dan menimpa PreProcessMessage metode . Saat input dikirim ke kontrol, input Message diproses sebelum kontrol menaikkan peristiwa. Anda dapat mencegat pesan-pesan ini untuk memodifikasi atau memblokirnya.

Contoh kode berikut menunjukkan cara menggunakan WParam properti Message parameter untuk mengubah tombol yang ditekan. Kode ini mendeteksi kunci dari F1 hingga F10 dan menerjemahkan kunci ke dalam kunci numerik mulai dari 0 hingga 9 (di mana F10 memetakan hingga 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

Baca juga