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 true
ayarlayınHandled.
-veya-
Olay KeyDown işleyicisinde sınıfının özelliğini KeyEventArgs olarak true
ayarlayı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.
.NET Desktop feedback