2011-11-01 29 views
5

Estoy usando SendKeys en un programa de automatización para el trabajo. He estado avanzando lentamente, y ahora estoy tratando de resolver todos los errores que he creado :-)Deshabilitar mediante programación el bloqueo de mayúsculas

Una de las cuales es que cuando utilicé SendKeys.Send ("Prueba"), si el CapsLock está activado, producirá "TEST" en lugar de "Test".

He utilizado el código siguiente para intentar detectar el estado capsLock, y cambiar si es necesario:

bool tmp = Control.IsKeyLocked(Keys.CapsLock); 
if (tmp) 
{ 
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENTEDKEY, (UIntPtr)0); 
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENTEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
    //Application.DoEvents(); <-Testing. 
} 

Y a continuación, utilizar inmediatamente SendKeys para enviar un texto:

SendKeys.SendWait("This Is An Over Capitalized Test String"); 

Qué AÚN sale como: "ESTE ES UN SORTEO DE PRUEBA CAPITALIZADO".

¿Hay alguna forma de evitar este problema?

¡Respondido! Solo para aclarar para cualquier otra persona, el problema se resolvió mediante el uso de

SendKeys.SendWait("{CAPSLOCK}" + text); 

primera vez que trató de utilizar:

SendKeys.SendWait("{CAPSLOCK}"); 
SendKeys.SendWait("This Is An Over Capitalized Test String"); 

los cuales no funcionaba en absoluto.

+1

¿Qué pasa si 'SendKeys.Send" {CAPSLOCK} Prueba "'? – V4Vendetta

Respuesta

9

¿Esto funciona para usted?

if(Control.IsKeyLocked(Keys.CapsLock)) 
     SendKeys.SendWait("{CAPSLOCK}This Is An Over Capitalized Test String"); 
    else 
     SendKeys.SendWait("This Is An Over Capitalized Test String"); 
+0

Acabo de probar esto, y no cambia el estado de la tecla CapsLock en absoluto. Con el otro método, apagaría el LED de CAPS, sin embargo, este ni siquiera lo produce. – HeWhoWas

+0

Déjeme redactar esa declaración. Usar el código exactamente como lo escribiste resolvió el problema. Estaba llamando a SendKeys.SendWait ("{CAPSLOCK}"); y luego enviando la cadena a otra línea. La clave está en hacer que CAPSLOCK alterne en la misma declaración SendKeys que el resto del texto que está enviando. ¡Gracias! – HeWhoWas

+0

El motivo es que un CAPSLOCK en una Sendkey causa que se envíe un CAPSLOCK DESPUÉS de que se complete la primera Sendkey. Agregue algunas escrituras de depuración para ver qué sucede. – Martin

0

Tengo una aplicación, en el que con frecuencia necesita cambiar entre izquierda-SHIFT y TAB. En mi teclado CAPSLOCK está entre esas 2 teclas y error de vez en cuando, escribiendo un CAPSLOCK en lugar de una TAB. Mi solución es invertir CAPSLOCK y enviar una TAB en su lugar. Para mi sorpresa, el programa gira hasta que se desborda la pila. Descubrí que la tecla CAPSLOCK se envía dos veces. Esta es mi solución final:

Dim CapsLockProg As Integer = 0 ' after Send Capslock arrives 2 times!!!!! 
Private Sub Description_KeyDown(sender As Object, e As KeyEventArgs) Handles Description.KeyDown 
    If e.KeyCode = Keys.Capital Then 
     If CapsLockProg < 2 Then 
      CapsLockProg += 1 
      If CapsLockProg = 1 Then 
       Windows.Forms.SendKeys.SendWait("{TAB}{CAPSLOCK}") 
      'Else 
      ' ignore 2nd Capslock 
      End If 
     Else 
      CapsLockProg = 0 
     End If 
    End If 
    If e.KeyCode = Keys.Tab Then 
    rest of code 
Cuestiones relacionadas