2010-09-30 16 views
7

Bei der Verarbeitung des Ereignisses Control.OnKeyPress gibt es eine KeyPressEventArgs, die eine KeyChar enthält.Holen Sie sich das Zeichen auf Control.KeyDown?

Aus Gründen der Benutzerfreundlichkeit brauche ich genau das gleiche KeyChar aber bei der Handhabung OnKeyDown Ereignis.

Die KeyEventArgs enthält keine char-bezogenen Daten. Ich meine, wenn drücken Sie die Taste A mit oder ohne Shift seine Auswirkungen auf die KeyCode, KeyData oder KeyValue. Das gleiche, wenn ich eine andere Sprache benutze, bekomme ich immer noch englische Hauptwerte.

Wie bekomme ich eine KeyPressEventArgs.KeyChar innerhalb KeyDown Ereignis?

Danke.

+2

Und welches Zeichen möchten Sie, wenn die Alt-Taste losgelassen wird? –

+1

'KeyPress' wird nicht ausgelöst, wenn die Alt-Taste losgelassen wird, aber' OnKeyDown' wird trotzdem ausgelöst, in diesem Fall ist das Zeichen '\ 0' gut genug. – DxCK

Antwort

9

Konvertieren Sie es. Hier ist eine einfache Funktion zum Umwandeln von 'A' in 'a'. Es konvertiert nur Großbuchstaben von [A-Z] festgelegt. Der Wert 32 ist diff zwischen 'A' und 'a'. Sicher können Sie es auf Ihre Anforderungen erweitern, oder fragen Sie nach Funktion hier.

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

, wenn Sie es funktioniert mit der aktuellen Kultur benötigen, sollten Sie ProcessKeyMessage Steuerverfahren außer Kraft setzen:

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

es hilfreich Hoffnung.

+1

Und wie betrachte ich die aktive Sprache? Zum Beispiel, wenn die aktive Sprache russisch ist, möchte ich russische Zeichen bekommen. – DxCK

+1

Sie sollten die Methode ProcessKeyMessage Control wie in meinem Beitrag beschrieben außer Kraft setzen. – mastak

+0

der zweite Code ist genug, es fängt auch die shfit. – Letterman

0

Ich denke, dass was Sie suchen, ist in der Tat die KeyCode-Eigenschaft.

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

Wenn Sie suchen, nur für bestimmte Tasten könnten Sie Setup eine Switch-Anweisung oder was auch immer das Herz begehrt.

0

Wenn Sie KeyDown anstelle von KeyPress verwenden möchten, um die zusätzlichen Informationen zu einem KeyDown-Ereignis zu erfassen, könnten Sie diese zusätzlichen Informationen möglicherweise in einem KeyDown-Ereignis erfassen und dann verwenden, wenn Sie KeyPress erhalten ? Eher ein hokey Ansatz, um sicher zu sein, aber ich bin mir nicht sicher von jedem anderen Ansatz, der wirklich in einer Tastaturzuordnung funktionieren wird, die "tote Schlüssel" (d. H. Zwei-Tasten-Sequenzen, die ein einzelnes Zeichen erzeugen). Ich weiß nicht, warum Microsoft nicht mehr Informationen zum KeyPress-Event (oder zu einer Menge seiner Events) mitgenommen hat, da der Versuch, Ursache-und-Wirkung-Ereignisse aufeinander abzustimmen, nicht perfekt ist, aber ich nicht Ich kenne wirklich keine bessere Alternative.

+0

Der Grund, warum ich 'KeyDown' anstelle von' KeyPress' verwenden möchte, ist die Zeit zwischen dem Drücken einer Taste durch den Benutzer bis zur Antwort meines Programms zu reduzieren. 'KeyPress' feuert nur, nachdem der Benutzer den Schlüssel verlassen hat, und das fügt zusätzliche unnötige Zeit hinzu, bis mein Programm reagiert. – DxCK

Verwandte Themen