2012-09-25 35 views
5

quiero conseguir las teclas pulsadas en el teclado, ya sea con o sin caplock:obtener minúsculas con keydown WPF

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

Cuando escribo "a" o "A" en el teclado, el resultado de correo. La clave es siempre "A". ¿Cómo puedo obtener 'a' para ingresar 'a'?

Gracias de antemano.

Respuesta

6

No puede usar el evento KeyDown. Tendrá que utilizar el evento TextInput. Esto imprimirá la letra original con su título (mayúscula/minúscula).

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

Ahora, esto también imprimirá el cambio y así sucesivamente si se presiona. Si no desea que esos modificadores obtengan el último elemento de la cadena, trátelo como una matriz de caracteres;) -

+0

extraño, entrada de texto no consigue despedido? – olidev

+0

@olidev Compruebe el árbol de objetos para ver si está adjuntando el UIElement adecuado. Comience a adjuntar el evento a la ventana y luego baje. –

+0

pero textInput también se activará desde el código, quiero obtener el controlador de eventos solo desde la entrada de clave – olidev

4

Reemplazar TextInput/PreviewTextInput (o escuchar los eventos) debería funcionar.

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

KeyEventArgs class tiene campo "Shift", que indica si se ha pulsado la tecla SHIFT.

De lo contrario, como se llamará al método Window_KeyDown cuando se presione CAPS_LOCK, puede guardar un valor bool que indica si se presionó la tecla CAPS_LOCK.

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

¿Qué ocurre si CapsLock está activado cuando se inicia la aplicación? ¿No sería eso tirar todo? –

0

La mejor manera de manejar esto es mediante el uso del evento Window_TextInput en lugar de KeyDown.

Pero como bien dice este evento no se dispara en su aplicación que más bien puede utilizar un truco como esto:

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

} 

Esto imprimirá correctamente los caracteres en función de si BloqMayus está encendido o no. El valor inicial de la Mayús puede ser recuperada usando este enlace:

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

Espero que esto funcione para usted.

5

Puede verificar en su evento KeyDown si CAPS lock está activado o desactivado utilizando el método Control.IsKeyLocked. Además, es posible que tenga que comprobar si el usuario escribe en el capital usando Shift clave que puede ser identificado utilizando Modifiers enumeración como esto -

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(); 
    } 
} 
Cuestiones relacionadas