I override ProcessCmdKey
and when I get Keys
argument, I want to check if this Keys
is Letter or Digit or Special Symbol.
I have this snippet
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
char key = (char)keyData;
if(char.IsLetterOrDigit(key)
{
Console.WriteLine(key);
}
return base.ProcessCmdKey(ref msg, keyData);
}
Everything works for letters and digits. but when I press F1-F12 it converts them to letters.
Maybe someone knows better way to solve this task?
Override the form's OnKeyPress
method instead. The KeyPressEventArgs
provides a KeyChar
property which allows you to utilize the static methods on char
.
As mentioned by Cody Gray in the comments, this method only fires on key strokes that have character information. Other key strokes such as F1-F12 should be processed in OnKeyDown
or OnKeyUp
, depending on your situation.
From MSDN:
Key events occur in the following order:
- KeyDown
- KeyPress
- KeyUp
The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events.
Example
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if (char.IsLetter(e.KeyChar))
{
// char is letter
}
else if (char.IsDigit(e.KeyChar))
{
// char is digit
}
else
{
// char is neither letter or digit.
// there are more methods you can use to determine the
// type of char, e.g. char.IsSymbol
}
}
Try
if( !(keyData >= Keys.F1 && keyData <= Keys.F12))
{
char key = (char)keyData;
if(char.IsLetterOrDigit(key))
{
Console.WriteLine(key);
return false;
}
}
return base.ProcessCmdKey(ref msg, keyData);
Try using keyData.KeyCode
and maybe even testing within a range instead of using the Char.IsLetterOrDigit. e.g.
if (keyData.KeyCode >= Keys.D0 && keyData.KeyCode <= Keys.Z) {
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With