Вземете символа на Control.KeyDown?

При обработка на събитие Control.OnKeyPress има KeyPressEventArgs, което съдържа KeyChar.

От съображения за използваемост имам нужда от точно същото KeyChar, но когато обработвам събитие OnKeyDown.

KeyEventArgs не съдържа данни, свързани с char. Искам да кажа, че ако натиснете клавиша A със или без Shift, това не засяга KeyCode, KeyData или KeyValue. Същото, когато използвам друг език, все още получавам главни английски стойности.

Как да получите KeyPressEventArgs.KeyChar в KeyDown събитие?

Благодаря.


person DxCK    schedule 30.09.2010    source източник
comment
И кой знак искате, когато клавишът Alt бъде освободен?   -  person Henk Holterman    schedule 30.09.2010
comment
KeyPress не се задейства при освобождаване на клавиша Alt, но OnKeyDown задейства въпреки това, в този случай знакът '\0' е достатъчно добър.   -  person DxCK    schedule 30.09.2010


Отговори (3)


Преобразувайте го. Ето проста функция за преобразуване на 'A' в 'a'. Преобразува само главни букви от набора [A-Z]. Стойността 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 );
}

Надявам се да е полезно.

person mastak    schedule 30.09.2010
comment
И как имам предвид активния език? например, ако активният език е руски, искам да получа руски знаци. - person DxCK; 30.09.2010
comment
Трябва да замените метода за управление на ProcessKeyMessage, както е описано в публикацията ми. - person mastak; 30.09.2010
comment
В началото си помислих, че няма да проверява Caps Lock, но току-що направих тест върху него и той задава флага за смяна, ако Caps Lock е нагоре и shift не е натиснат. така че стискам палци (y) - person Mubashar; 14.11.2013

Мисля, че това, което търсите, всъщност е свойството 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
    }
}

Ако просто търсите определени ключове, можете да настроите превключвател или каквото сърцето ви желае.

person Christopher B. Adkins    schedule 30.09.2010

Ако причината, поради която искате да използвате KeyDown вместо KeyPress, е да заснемете допълнителната информация, която е дадена на събитие KeyDown, бихте ли могли да заснемете тази допълнителна информация в събитие KeyDown и след това да я използвате, когато получите KeyPress? Разбира се, по-скоро хокеен подход, но не съм сигурен за друг подход, който наистина ще работи в картографиране на клавиатура, което има „мъртви клавиши“ (т.е. последователности от два клавиша, които произвеждат един знак). Не знам защо Microsoft не пренесе повече информация до събитието KeyPress (или много от неговите събития, по този въпрос), тъй като опитът да се съпоставят причинно-следствените събития не е перфектен, но аз не наистина не знам по-добра алтернатива.

person supercat    schedule 30.09.2010
comment
Причината, поради която искам да използвам KeyDown вместо KeyPress, е да намаля времето между потребителското натискане на клавиш до отговора на моята програма. KeyPress задейства само след като потребителят остави ключа и това добавя допълнително ненужно време, докато програмата ми отговори. - person DxCK; 30.09.2010