2012-09-25 12 views
5

ich auf der Tastatur die Tasten gedrückt bekommen entweder mit oder ohne caplock:erhalten Klein mit keydown wpf

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    e.Key.ToString(); 
} 

Als ich „a“ oder „A“ auf der Tastatur, das Ergebnis der E-Typen. Der Schlüssel ist immer "A". Wie kann ich 'a' für die Eingabe von 'a' bekommen?

Vielen Dank im Voraus.

Antwort

6

Sie können das Ereignis KeyDown nicht verwenden. Sie müssen das Ereignis TextInput verwenden. Dadurch wird der ursprüngliche Buchstabe mit der Beschriftung (Groß-/Kleinschreibung) gedruckt.

Nun wird auch die Shift und so weiter gedruckt, wenn es gedrückt wird. Wenn Sie nicht möchten, dass diese Modifikatoren nur das letzte Element der Zeichenkette erhalten - behandeln Sie es als Char-Array -

+0

seltsam, TextInput- nicht gefeuert bekommt? – olidev

+0

@olidev Überprüfen Sie den Objektbaum, um festzustellen, ob Sie ihm das richtige UIElement anhängen. Beginnen Sie, das Ereignis an das Fenster anzuhängen, und gehen Sie dann nach unten. –

+0

aber TextInput wird auch aus dem Code ausgelöst, möchte ich Ereignishandler nur von der Schlüsseleingabe – olidev

4

Overriding TextInput/PreviewTextInput (oder das Abhören der Ereignisse) sollte funktionieren.

protected override void OnPreviewTextInput(TextCompositionEventArgs e) 
{ 
    base.OnPreviewTextInput(e); 
    Console.WriteLine(e.Text); 
} 
2

KeyEventArgs class hat "Shift" Feld, das anzeigt, ob die Taste SHIFT gedrückt wurde.

Andernfalls, da die Window_KeyDown-Methode aufgerufen wird, wenn CAPS_LOCK gedrückt wird, können Sie einen Bool-Wert speichern, der angibt, ob die CAPS_LOCK-Taste gedrückt wurde.

bool isCapsLockPressed; 
    private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { 
      if(e.KeyCode == Keys.CapsLock) { 
       isCapsLockPressed = !isCapsLockPressed; 
      } 
    } 
+1

Was passiert, wenn CapsLock beim Start der App eingeschaltet ist? Würde das nicht alles wegwerfen? –

0

Der beste Weg, dies zu behandeln, ist mit Window_TextInput Ereignis statt KeyDown.

Aber wie Sie dieses Ereignis nicht gesagt, auf Ihre Anwendung nicht abfeuern kann man eher einen Hack wie folgt verwenden:

bool iscapsLock = false; 
bool isShift = false; 
private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.CapsLock) 
     iscapsLock = !iscapsLock; 

    if (e.Key >= Key.A && e.Key <= Key.Z) 
    { 
     bool shift = isShift; 
     if (iscapsLock) 
      shift = !shift; 
     int s = e.Key.ToString()[0]; 
     if (!shift) 
     { 
      s += 32; 
     } 
     Debug.Write((char)s); 
    } 

} 

Dadurch werden die Zeichen richtig gedruckt werden basierend darauf, ob capslock ein- oder ausgeschaltet ist. Der Anfangswert des Capslock kann über diesen Link abgerufen werden:

http://cboard.cprogramming.com/csharp-programming/105103-how-detect-capslock-csharp.html

Ich hoffe, das für Sie arbeitet.

5

Sie können Ihr KeyDown-Ereignis einchecken, ob CAPS lock mit der Methode Control.IsKeyLocked ein- oder ausgeschaltet ist. Auch, müssen Sie prüfen, ob Benutzer in der Hauptstadt mit Shift Schlüssel eingegeben, die Modifiers Enum wie dies mit identifiziert werden können -

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    string key = e.Key.ToString(); 
    bool isCapsLockOn = System.Windows.Forms.Control 
         .IsKeyLocked(System.Windows.Forms.Keys.CapsLock); 
    bool isShiftKeyPressed = (Keyboard.Modifiers & ModifierKeys.Shift) 
           == ModifierKeys.Shift; 
    if (!isCapsLockOn && !isShiftKeyPressed) 
    { 
     key = key.ToLower(); 
    } 
}