2010-09-30 16 views
7

Podczas obsługi zdarzeń Control.OnKeyPress, istnieje KeyPressEventArgs, który zawiera KeyChar.Pobierz znak na Control.KeyDown?

Ze względów praktycznych potrzebuję dokładnie tego samego KeyChar, ale podczas obsługi zdarzenia OnKeyDown.

Urządzenie KeyEventArgs nie zawiera żadnych danych związanych z rysunkami. Mam na myśli, jeśli naciśnięcie klawisza A z lub bez Shift nie ma wpływu na KeyCode, KeyData lub KeyValue. To samo, gdy używam innego języka, wciąż uzyskuję wartości w języku angielskim.

Jak uzyskać KeyPressEventArgs.KeyChar w wydarzeniu KeyDown?

Dzięki.

+2

A jaki znak chcesz mieć po zwolnieniu klawisza Alt? –

+1

'KeyPress' nie uruchamia się po zwolnieniu klawisza Alt, ale" OnKeyDown "tak czy inaczej, w tym przypadku znak" \ 0 "jest wystarczająco dobry. – DxCK

Odpowiedz

9

Konwersja. Oto prosta funkcja do zamiany "A" na "a". Konwertuje tylko znaki kapitałowe z zestawu [A-Z]. Wartość 32 to różnica między "A" i "a". Oczywiście możesz ją rozszerzyć do swoich wymagań lub poprosić o funkcję tutaj.

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

jeśli jest to potrzebne do prac z bieżącej kultury powinny przesłonić metodę ProcessKeyMessage sterowania:

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

Mam nadzieję, że pomocne.

+1

A jak biorę pod uwagę aktywny język? na przykład, jeśli aktywnym językiem jest rosyjski, chcę uzyskać rosyjskie znaki. – DxCK

+1

Należy zastąpić metodę kontroli ProcessKeyMessage, tak jak opisano w moim poście. – mastak

+0

wystarcza drugi kod, który również obejmuje shfit. – Letterman

0

Myślę, że to, czego szukasz, to w rzeczywistości właściwość 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 
    } 
} 

Jeśli szukasz tylko niektórych kluczy, możesz ustawić informację o przełączniku lub cokolwiek chcesz.

0

Jeśli chcesz użyć KeyDown zamiast KeyPress, możesz przechwycić dodatkowe informacje, które zostały przekazane do zdarzenia KeyDown, czy możesz uchwycić te dodatkowe informacje w zdarzeniu KeyDown, a następnie użyć go, gdy otrzymasz KeyPress? ? Raczej podejście hokey, ale nie jestem pewien żadnego innego podejścia, które naprawdę działa w mapowaniu klawiatury, które ma "martwe klucze" (tj. Sekwencje dwu klawiszowe, które tworzą pojedynczą postać). Nie wiem, dlaczego Microsoft nie przenosił więcej informacji na wydarzenie KeyPress (lub na wiele jego wydarzeń), ponieważ próba dopasowania zdarzeń powodujących efekt nie jest doskonała, ale ja nie Naprawdę znam lepszą alternatywę.

+0

Powodem, dla którego chcę użyć 'KeyDown' zamiast' KeyPress' jest skrócenie czasu pomiędzy naciśnięciem klawisza a odpowiedzią mojego programu. 'KeyPress' uruchamia się tylko po tym, jak użytkownik opuścił klucz, a to spowoduje dodatkowy niepotrzebny czas, aż mój program odpowie. – DxCK