Как определить, является ли KeyCode печатным символом - PullRequest
9 голосов
/ 03 сентября 2010

Я обрабатываю событие нажатия клавиши на одном из моих элементов управления.Если нажатая клавиша является фактическим вводом (буквенным, цифровым или каким-либо символом), я хочу добавить ее к имеющейся у меня строке.Если это контрольный персонаж (вход, выход и т. Д.), Я не хочу ничего делать.

Существует ли быстрый и простой способ определить, является ли код клавиши печатным или управляющим символом?

В настоящее время я делаю

if (e.KeyCode == Keys.Enter)
      {
        e.Handled = false;
        return;
      }

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

Ответы [ 4 ]

11 голосов
/ 04 сентября 2010

Если вам нужны только печатные символы, то, вероятно, вы не хотите OnKeyDown. Вместо этого следует использовать OnKeyPress, который называется only для печатаемых символов (более или менее) и применяет переводы для клавиш-модификаторов (прежде всего Shift).

Я сказал «более или менее» выше, потому что вы также получите контрольные символы, которые не обязательно для печати . Их можно легко отфильтровать с помощью char.IsControl.

protected override void OnKeyPress(KeyPressEventArgs e){
    if(!char.IsControl(e.KeyChar)){
        // do something with printable character
    }
}

Что-то, что легко упустить из виду в дизайне, это ключ возврата. Как правило, наилучшее поведение при получении символа возврата ('\b' или (char)8) - удалить последний символ из буфера. Это легко забыть сделать.

6 голосов
/ 04 сентября 2010

Если вы обрабатываете событие KeyPress вместо KeyDown, KeyPressEventArgs будет иметь свойство KeyChar .Это уменьшит количество «лишних» ключевых событий, которые вы получите.Затем вы можете использовать что-то вроде char.IsLetterOrDigit или char.IsControl для фильтрации того, что вы хотите.

3 голосов
/ 04 сентября 2010

Если у вас есть только KeyCode, вы можете попробовать P / Invoking в функции MapVirtualKey .Я не уверен, что это будет работать для всех культур.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int MapVirtualKey(int uCode, int uMapType);

public static bool RepresentsPrintableChar(this Keys key)
{
   return !char.IsControl((char)MapVirtualKey((int)key, 2));
}

Console.WriteLine(Keys.Shift.RepresentsPrintableChar());
Console.WriteLine(Keys.Enter.RepresentsPrintableChar());
Console.WriteLine(Keys.Divide.RepresentsPrintableChar());
Console.WriteLine(Keys.A.RepresentsPrintableChar());

Вывод:

false
false
true
true
0 голосов
/ 13 марта 2016

Отметьте эту функцию, вы можете привести char к byte (или просто отредактировать функцию):

bool IsPrintable(byte item)
{
    // Range of chars from space till ~ (tilda)
    return item >= 32 && item < 126;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...