4 Stimmen

Warum gibt KeyChar für Delete dasselbe zurück wie für Period?

Ich fange ein KeyPress-Event ab, um auf bestimmte Arten von erlaubten Werten zu prüfen. Um löschen zu können, verwende ich folgenden Code vor der eigentlichen Prüfung

if (e.KeyChar == (char)Keys.Delete || e.KeyChar == (char)Keys.Back)
{
   return;
}
...actual check for only digits or whatever

Das Problem ist, dass e.KeyChar == (char)Keys.Delete auch wahr ist, wenn ich den Punkt auf meiner Tastatur drücke.

Wie kann das sein? Und was könnte ich dagegen tun?

感謝

9voto

Ferdinand Beyer Punkte 61121

から MSDN-Dokumentation über den Tasten Aufzählung :

Die Klasse Keys enthält Konstanten für die Verarbeitung von Tastatureingaben. Die Mitglieder der Keys-Aufzählung bestehen aus einem Tastencode und einer Reihe von Modifikatoren, die in einem einzigen Integer-Wert zusammengefasst sind. In der Win32-Anwendungsprogrammierschnittstelle (API) besteht ein Tastenwert aus zwei Hälften, wobei die höherwertigen Bits den Tastencode enthalten (der dem virtuellen Tastencode von Windows entspricht) und die niederwertigen Bits Tastenmodifikatoren wie die SHIFT-, CONTROL- und ALT-Tasten darstellen.

Umrechnung dieser Konstanten in char ist sinnlos, da Sie wertvolle Informationen verlieren und die konstanten Werte nicht den ASCII-Zeichencodes entsprechen.

から MSDN über die SchlüsselZeichen ざい KeyPressEventArgs :

Sie können die folgenden Schlüssel nicht erhalten oder setzen (...) INSERT und DELETE (...)

SchlüsselZeichen gibt die char Wert (ASCII-Zeichencode), der der gedrückten Taste entspricht, und nicht den (rohen) Tastencode. Daher können Sie verschiedene Sondertasten nicht erkennen und den Wert nicht mit dem Tasten Aufzählungskonstanten.

Verwenden Sie die KeyCode ざい KeyEventArgs stattdessen. Da es vom Typ Tasten no char ist es für Ihren Zweck gut geeignet. Um auf diese Informationen zuzugreifen, müssen Sie die KeyDown Ereignis statt des KeyPress Veranstaltung.

Übrigens, nach Angaben der MSDN-Seite über das Kontrolle KeyPress Veranstaltung wird dieses Ereignis für Nicht-Zeichen-Tasten überhaupt nicht ausgelöst:

Das KeyPress-Ereignis wird von Nicht-Zeichen-Tasten nicht ausgelöst; die Nicht-Zeichen-Tasten lösen jedoch die KeyDown- und KeyUp-Ereignisse aus.

3voto

Meta-Knight Punkte 17142

Vielleicht sollten Sie vergleichen mit e.KeyCode stattdessen. Das ist präziser und Sie müssen nicht umrechnen. Keys.Delete y Keys.Back zu einer char .

0voto

itsmatt Punkte 30839

Vielleicht würde es in Ihrer Anwendung funktionieren, stattdessen das KeyDown-Ereignis zu erfassen.

Sie könnten dann z. B. Folgendes tun:

if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back)
{
   return;
}

Beachten Sie, dass KeyCode Teil der Args ist, die für KeyDown und KeyUp übergeben werden, nicht aber für KeyPress.

0voto

Anax Punkte 8732

KeyPress arbeitet mit Zeichen, KeyDown arbeitet mit Tasten. Wie sowohl Meta-Knight als auch itsmatt vorgeschlagen haben, sollten Sie KeyDown verwenden, wenn Sie Tasten erkennen wollen.

Wenn Sie sich die arithmetische Tastatur ansehen, werden Sie feststellen, dass Del y . auf derselben Taste liegen.

0voto

//If you can change the event handler for the control 
//that you are looking at catching the keys.  
//In the example below textBox1 is using 
//setting the KeyEventHandler to be KeyDownEvents Method...  
//this has the KeyCode properties...

this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownEvents);
//This is the code in the event...
 private void KeyDownEvents(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.BrowserBack)
            {
                MessageBox.Show(e.KeyCode.ToString());
            }
        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X