Aracılığıyla paylaş


Klavye tuşu olaylarını değiştirme (Windows Forms .NET)

Windows Forms, klavye girişini kullanma ve değiştirme olanağı sağlar. Anahtar kullanmak, bir yöntem veya olay işleyicisi içindeki bir anahtarı işlemeyi ifade eder, böylece ileti kuyruğunun daha aşağısındaki diğer yöntemler ve olaylar anahtar değerini almaz. Anahtarın değiştirilmesi, bir anahtarın değerini değiştirerek, yöntemlerin ve olay işleyicilerinin ileti kuyruğunun daha aşağısına farklı bir anahtar değeri alması anlamına gelir. Bu makalede, bu görevlerin nasıl yerine getirileri gösterilmektedir.

Anahtar kullanma

Olay KeyPress işleyicisinde sınıfının özelliğini KeyPressEventArgs olarak trueayarlayınHandled.

-veya-

Olay KeyDown işleyicisinde sınıfının özelliğini KeyEventArgs olarak trueayarlayınHandled.

Not

Olay işleyicisinde özelliğinin Handled KeyDown ayarlanması ve KeyUp olaylarının KeyPress geçerli tuş vuruşu için tetiklenmesini engellemez. SuppressKeyPress Bu amaç için özelliğini kullanın.

Aşağıdaki örnek, ve a karakter anahtarlarını kullanmak A için olayı işlerKeyPress. Bu tuşlar metin kutusuna yazılamaz:

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

Standart karakter anahtarını değiştirme

Bir KeyPress olay işleyicisinde, sınıfının özelliğini KeyPressEventArgs yeni karakter anahtarının değerine ayarlayınKeyChar.

Aşağıdaki örnek, herhangi bir A ve a karakter anahtarını !olarak değiştirmek için olayını işlerKeyPress:

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

Karakter olmayan bir anahtarı değiştirme

Karakter olmayan tuş basmalarını yalnızca denetimden devralarak ve yöntemini geçersiz kılarak PreProcessMessage değiştirebilirsiniz. Giriş Message denetime gönderildikçe, denetim olayları oluşturmadan önce işlenir. Bu iletileri değiştirmek veya engellemek için araya girebilirsiniz.

Aşağıdaki kod örneği, basılan anahtarı değiştirmek için parametresinin Message özelliğinin nasıl kullanılacağını WParam gösterir. Bu kod, F1 ile F10 arasında bir anahtar algılar ve anahtarı 0 ile 9 arasında bir sayısal anahtara çevirir (burada F10 0 ile eşler).

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

Ayrıca bkz.