Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if Keys is Letter/Digit/Special Symbol

Tags:

c#

key

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?

like image 660
Zlobaton Avatar asked Apr 19 '11 15:04

Zlobaton


3 Answers

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
  }
}
like image 100
bernhof Avatar answered Nov 04 '22 04:11

bernhof


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);
like image 29
Bala R Avatar answered Nov 04 '22 05:11

Bala R


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) {
  ...
}
like image 26
Brad Christie Avatar answered Nov 04 '22 05:11

Brad Christie