2010-09-30 2 views
7

При обработке события Control.OnKeyPress есть KeyPressEventArgs, который содержит KeyChar.Получить символ на Control.KeyDown?

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

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

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

Спасибо.

+2

И какой символ вы хотите, когда клавиша Alt отпущена? –

+1

'KeyPress' не срабатывает, когда клавиша Alt отпускается, но' OnKeyDown' срабатывает в любом случае, в этом случае char '\ 0' достаточно хорош. – DxCK

ответ

9

Преобразуйте его. Вот простая функция для преобразования 'A' в 'a'. Он преобразует только символы капитала от [A-Z] set. Значение 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

И как я рассматриваю активный язык? например, если активным языком является русский, я хочу получить русские символы. – DxCK

+1

Вы должны переопределить метод ProcessKeyMessage Control, как описано в моем сообщении. – mastak

+0

второго кода достаточно, он также ловит shfit. – Letterman

0

Я думаю, что то, что вы ищете, на самом деле является свойством 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

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

+0

Причина, по которой я хочу использовать 'KeyDown' вместо' KeyPress', - это сократить время между нажатием клавиши до нажатия моей программы. «KeyPress» срабатывает только после того, как пользователь оставил ключ, и это добавляет лишнее время, пока моя программа не ответит. – DxCK