Получить символ на Control.KeyDown? - PullRequest
       12

Получить символ на Control.KeyDown?

7 голосов
/ 30 сентября 2010

При обработке события Control.OnKeyPress существует KeyPressEventArgs, который содержит KeyChar.

. Из соображений удобства использования мне нужно точно такое же KeyChar, но при обработке события OnKeyDown.

KeyEventArgs не содержит данных, связанных с символами.Я имею в виду, если нажать клавишу A с или без Shift, это не повлияет на KeyCode, KeyData или KeyValue.То же самое при использовании другого языка, я все еще получаю заглавные английские значения.

Как получить KeyPressEventArgs.KeyChar внутри KeyDown события?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 30 сентября 2010

Преобразуйте это.Вот простая функция для преобразования «А» в «а».Он конвертирует только заглавные буквы из набора [AZ] .Значение 32 отличается от 'A' до 'a'. Конечно, вы можете расширить его в соответствии с вашими требованиями или попросить функцию здесь.

char getChar( KeyEventArgs e )
{
 int keyValue = e.KeyValue;
 if ( !e.Shift && keyValue >= (int) Keys.A && keyValue <= (int) Keys.Z )
  return (char)(keyValue + 32);
 return (char) keyValue;
}

, если вам это нужно для работы с вашей текущей культурой, выдолжен переопределить ProcessKeyMessage Метод управления:

protected override bool ProcessKeyMessage( ref Message m )
{
 if ( ( m.Msg == 0x102 ) || ( m.Msg == 0x106 ) ) // this is special - don't remove
 {
  char c = (char) m.WParam; // here is your char for OnKeyDown event ;)
 }
 return base.ProcessKeyMessage( ref m );
}

Надеюсь, это полезно.

1 голос
/ 30 сентября 2010

Я думаю, что то, что вы ищете, на самом деле является свойством KeyCode.

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Determine whether the key entered is the F1 key. If it is, display Help.
    if(e.KeyCode == Keys.A)
    {
        // Do something kewl
    }
    else if(e.KeyCode == Keys.B)
    {
        // Do something even kewler
    }
}

Если вы просто ищете определенные ключи, вы можете установить статус переключателя или то, что душе угодно.

0 голосов
/ 30 сентября 2010

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

...