2011-11-01 13 views
5

Używam SendKeys w programie automatyzacji do pracy. Posuwałam się naprzód i próbuję teraz naprawić wszystkie błędy, które stworzyłem :-)Programowo wyłącz blokadę caps

Jednym z nich jest to, że kiedy użyłem SendKeys.Send ("Test"), jeśli CapsLock jest włączony, wytworzy "test" w przeciwieństwie do "testu".

Użyłem następujący kod do próbują wykryć stan CapsLock i włączyć ją w razie potrzeby:

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. 
} 

a następnie natychmiast użyć SendKeys wysłać tekst:

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

Która STILL wychodzi jako: "TO JEST NA KAPITALIZOWANYM TESTIE TESTOWYM".

Czy istnieje sposób na obejście tego problemu?

Udzielono odpowiedzi! Po prostu do wyjaśnienia dla nikogo innego, problem został rozwiązany za pomocą

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

raz pierwszy próbował użyć:

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

które nie działają w ogóle.

+1

Co zrobić, jeśli wykonasz polecenie "SendKeys.Send" {CAPSLOCK} Test "'? – V4Vendetta

Odpowiedz

9

czy to działa?

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

Właśnie to przetestowałem i nie zmienia to w ogóle stanu klawisza CapsLock. W przypadku drugiej metody dioda LED CAPS byłaby wyłączona, ale ta nawet tego nie produkuje. – HeWhoWas

+0

Pozwól mi zredagować to oświadczenie. Używanie kodu dokładnie tak, jak napisałeś, rozwiązało problem. Nazwałem SendKeys.SendWait ("{CAPSLOCK}"); a następnie wysłanie ciągu w innej linii. Kluczem jest przełączenie CAPSLOCK w tym samym wyciągu SendKeys, co reszta wysyłanego tekstu. Dzięki! – HeWhoWas

+0

Powodem jest to, że CAPSLOCK w Sendkey powoduje wysłanie dodatkowej CAPSLOCK PO zakończeniu pierwszego Sendkey. Dodaj kilka zapisów debugowania, aby zobaczyć, co się stanie. – Martin

0

Mam aplikację, w której często potrzebuję przełączać się pomiędzy lewymi SHIFT i TAB. Na mojej klawiaturze CAPSLOCK znajduje się pomiędzy tymi 2 kluczami i od czasu do czasu mylę się, wpisując CAPSLOCK zamiast TAB. Moim rozwiązaniem jest odwrócenie CAPSLOCK i przesłanie TAB. Ku mojemu zaskoczeniu program zapętla się, aż do przepełnienia stosu. Dowiedziałem się, że klucz CAPSLOCK jest wysyłany dwa razy. To jest moje ostateczne rozwiązanie:

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 
Powiązane problemy