2010-09-03 17 views
8

Ich verarbeite das Key-Down-Ereignis auf einem meiner Steuerelemente. Wenn die gedrückte Taste eine tatsächliche Eingabe ist (alphabetisch, numerisch oder irgendein Symbol), möchte ich sie an eine Zeichenfolge anhängen, die ich habe. Wenn es ein Steuerzeichen ist (Enter, Escape, etc ..) will ich nichts machen.So ermitteln Sie, ob KeyCode druckbares Zeichen ist

Gibt es eine schnelle und einfache Möglichkeit zu bestimmen, ob der Schlüsselcode ein druckbares Zeichen oder ein Steuerzeichen ist?

Derzeit mache ich

if (e.KeyCode == Keys.Enter) 
     { 
     e.Handled = false; 
     return; 
     } 

Aber ich weiß, gibt es wahrscheinlich ein paar mehr Tasten ich wichtig im System-Handler über diese etwas tun sie sich nicht, so dass ich nicht möchte, dass sie nicht behandeln.

Antwort

8

Wenn Sie nur druckbare Zeichen möchten, dann möchten Sie wahrscheinlich nicht OnKeyDown. Sie sollten stattdessen OnKeyPress verwenden, das nur für druckbare Zeichen (mehr oder weniger) genannt wird, und wendet Übersetzungen für Modifizierschlüssel (hauptsächlich Shift) an.

sagte ich, „mehr oder weniger“ oben, weil Sie auch Steuerzeichen erhalten wird, die druckbare nicht unbedingt sind. Diese können jedoch problemlos mit char.IsControl herausgefiltert werden.

protected override void OnKeyPress(KeyPressEventArgs e){ 
    if(!char.IsControl(e.KeyChar)){ 
     // do something with printable character 
    } 
} 

Etwas, das in einem Design wie diesem leicht zu übersehen ist, ist die Rücktaste. In der Regel ist das beste Verhalten beim Empfang eines Backspace-Zeichens ('\b' oder (char)8) das Entfernen des letzten Zeichens aus Ihrem Puffer. Es vergisst leicht, dies zu tun.

6

Wenn Sie das Ereignis KeyPress statt KeyDown behandeln, hat das KeyPressEventArgs eine KeyChar Eigenschaft. Dadurch wird die Anzahl der zusätzlichen Schlüsselereignisse reduziert. Sie können dann etwas wie char.IsLetterOrDigit oder char.IsControl verwenden, um zu filtern, was Sie wollen.

3

Angenommen, Sie haben nur die KeyCode, können Sie P/Invoking in die MapVirtualKey Funktion versuchen. Ich bin mir nicht sicher, ob das für alle Kulturen funktionieren wird.

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int MapVirtualKey(int uCode, int uMapType); 

public static bool RepresentsPrintableChar(this Keys key) 
{ 
    return !char.IsControl((char)MapVirtualKey((int)key, 2)); 
} 

Console.WriteLine(Keys.Shift.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Enter.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Divide.RepresentsPrintableChar()); 
Console.WriteLine(Keys.A.RepresentsPrintableChar()); 

Ausgang:

false 
false 
true 
true 
0

Aktivieren Sie diese Funktion, können Sie char zu byte (oder einfach bearbeiten Sie die Funktion) werfen:

bool IsPrintable(byte item) 
{ 
    // Range of chars from space till ~ (tilda) 
    return item >= 32 && item < 126; 
} 
Verwandte Themen