Toetsenbordtoets-gebeurtenissen wijzigen (Windows Forms .NET)
Windows Forms biedt de mogelijkheid om toetsenbordinvoer te gebruiken en te wijzigen. Het consumeren van een sleutel verwijst naar het verwerken van een sleutel binnen een methode of event-handler, zodat andere methoden en gebeurtenissen later in de berichtenwachtrij de sleutelwaarde niet ontvangen. En het wijzigen van een sleutel verwijst naar het wijzigen van de waarde van een sleutel, zodat methoden en gebeurtenis-handlers verderop in de berichtenwachtrij een andere sleutelwaarde ontvangen. In dit artikel wordt beschreven hoe u deze taken uitvoert.
Een sleutel verbruiken
Stel in een KeyPress gebeurtenishandler de eigenschap Handled van de klasse KeyPressEventArgs in op true
.
-of-
Stel in een KeyDown gebeurtenishandler de eigenschap Handled van de klasse KeyEventArgs in op true
.
Notitie
Bij het instellen van de eigenschap Handled in de KeyDown event-handler, voorkomt dit niet dat de KeyPress en KeyUp gebeurtenissen worden opgeroepen voor de huidige toetsaanslag. Gebruik hiervoor de eigenschap SuppressKeyPress.
In het volgende voorbeeld wordt de KeyPress gebeurtenis verwerkt om de A
en a
tekensleutels te gebruiken. Deze sleutels kunnen niet worden getypt in het tekstvak:
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
Een standaardtekensleutel wijzigen
Stel in een KeyPress gebeurtenishandler de eigenschap KeyChar van de KeyPressEventArgs-klasse in op de waarde van de nieuwe tekensleutel.
In het volgende voorbeeld wordt de KeyPress gebeurtenis verwerkt om A
en a
tekentoetsen te wijzigen in !
:
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
Een niet-lettertoets wijzigen
U kunt alleen toetsen zonder tekens wijzigen door het overnemen van het besturingselement en het overschrijven van de PreProcessMessage methode. Wanneer de invoer Message naar de regelaar wordt verzonden, wordt deze verwerkt voordat de regelaar gebeurtenissen genereert. U kunt deze berichten onderscheppen om ze te wijzigen of te blokkeren.
In het volgende codevoorbeeld ziet u hoe u de eigenschap WParam van de parameter Message kunt gebruiken om de ingedrukt toets te wijzigen. Met deze code wordt een sleutel van F1 tot F10 gedetecteerd en wordt de sleutel omgezet in een numerieke sleutel, variƫrend van 0 tot 9 (waarbij F10 wordt toegewezen aan 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
Zie ook
.NET Desktop feedback