Проверьте, являются ли клавиши буквой / цифрой / специальным символом

заменить ProcessCmdKey и когда я получаю

6 ответов


переопределить форму метод. The KeyPressEventArgs предоставляет KeyChar свойство, которое позволяет использовать статические методы на char.

как упоминалось Коди Грей в комментариях, этот метод срабатывает только на ключевых штрихах, которые имеют информацию о символах. Другие ключевые штрихи, такие как F1-F12, должны обрабатываться в OnKeyDown или OnKeyUp в зависимости от вашей ситуации.

С MSDN:

ключевые события происходят в следующем порядок:

на событие нажатия клавиши не вызывается нехарактерные ключи; однако нехарактерные ключи поднимают KeyDown и keyup.

пример

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
  }
}

попробовать

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);

попробуйте использовать keyData.KeyCode и, возможно, даже тестирование в пределах диапазона вместо использования Char.IsLetterOrDigit. например,

if (keyData.KeyCode >= Keys.D0 && keyData.KeyCode <= Keys.Z) {
  ...
}

if (keyData >= Keys.F1 && keyData <= Keys.F12)
{
     //one of the key between F1~F12 is pressed
}

вам нужно или гигантское заявление переключателя / случая или проверка для рядов. Возможно, Вам будет легче проверить ключи, которые вы хотите исключить, в зависимости от того, которых меньше. Посмотрите на это для всех возможных значений. http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

if (keyData >= Keys.A && keyData <= Keys.Z)
   // do something

или

switch(keyData) {
case Keys.Add:
case Keys.Multiply:
// etc.
   // do something
   break;
}

Я пробовал следующий код, но по какой-то причине char.Метод IsLetter () распознает следующие ключи как буквы???

Ф1, Ф8, Ф9, Ф11, Ф12, RightShift, LeftShift, RightAlt, RightCtrl, LeftCtrl, LeftWin, RightWin, Что NumLock.

этот метод, похоже, не является полным доказательством того, что он считает буквой.

if(char.IsLetter((char)e.Key) || char.IsDigit((char)e.Key))