2012-09-25 17 views
5

chcę uzyskać wciśnięty na klawiaturze lub bez caplock klawiszy:się małymi literami z keydown WPF

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

Po wpisaniu „a” lub „A” na klawiaturze, w wyniku np. Klucz to zawsze "A". Jak mogę uzyskać "a" na wprowadzenie "a"?

Z góry dziękuję.

Odpowiedz

6

Nie można użyć zdarzenia KeyDown. Musisz użyć zdarzenia TextInput. Spowoduje to wydrukowanie oryginalnej litery z jej opisem (wielkie/małe litery).

private void Window_TextInput(object sender, TextCompositionEventArgs e) 
    { 
     Console.WriteLine(e.Text); 
    } 

Teraz wydrukuje również Shift i tak dalej, jeśli zostanie naciśnięty. Jeśli nie chcesz, aby te modyfikatory właśnie pobierały ostatni element ciągu - potraktuj go jako tablicę znaków;) -

+0

dziwne, TextInput nie wylecieć? – olidev

+0

@olidev Sprawdź drzewo obiektów, aby sprawdzić, czy dołączasz je do odpowiedniego UIElement. Zacznij dołączanie zdarzenia do okna, a następnie zejdź na dół. –

+0

ale textInput zostanie uruchomiony również z kodu, chcę uzyskać obsługę zdarzeń tylko z klucza wejściowego – olidev

4

Nadpisanie wartości TextInput/PreviewTextInput (lub odsłuchiwanie zdarzeń) powinno działać.

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

KeyEventArgs class ma "Shift" pole, które wskazującą, czy klawisz SHIFT został naciśnięty.

W przeciwnym razie, ponieważ metoda Window_KeyDown zostanie wywołana po naciśnięciu CAPS_LOCK, można zapisać wartość bool wskazującą, czy został naciśnięty klawisz CAPS_LOCK.

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

Co zrobić, jeśli CapsLock jest włączony, gdy aplikacja jest uruchomiona? Czy to nie wyrzuciłoby wszystkiego? –

0

Najlepszym sposobem na poradzenie sobie z tym problemem jest użycie zdarzenia Window_TextInput zamiast KeyDown.

Ale jak powiedział to zdarzenie nie ognia od aplikacji można używać hack raczej tak:

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

} 

To będzie poprawnie drukować znaki na podstawie tego, czy CapsLock jest włączony czy nie. Wartość początkowa CapsLock mogą być pobierane za pomocą tego linku:

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

Mam nadzieję, że to działa dla Ciebie.

5

Możesz sprawdzić w swoim zdarzeniu KeyDown czy CAPS lock jest włączone lub wyłączone przy użyciu metody Control.IsKeyLocked. Ponadto, może być konieczne, aby sprawdzić, czy użytkownik wpisał w kapitale użyciu Shift klucz, który można zidentyfikować za pomocą Modifiers wyliczenia takiego -

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(); 
    } 
} 
Powiązane problemy