2011-11-01 117 views
5

我使用的SendKeys在工作的自動化程序。我一直在努力,現在正在努力消除我創建的所有錯誤:-)編程方式禁用大寫鎖定

其中之一是,當我使用SendKeys.Send(「Test」)時,如果CapsLock它將產生「測試」而不是「測試」。

我用下面的代碼來嘗試檢測大寫鎖定狀態,並在必要時將其切換:

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

然後立即使用的SendKeys發送一些文字:

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

哪仍然出現:「這是一個超過預定的測試sTRING」。

有什麼辦法來解決這個問題呢?

回答!只是爲了澄清爲別人,這個問題是通過使用

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

解決我第一次嘗試使用:

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

哪個沒有在所有的工作。

+1

如果您執行'SendKeys.Send「{CAPSLOCK}測試」'? – V4Vendetta

回答

9

這是否對你的工作?

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

我只是測試這一點,它根本不會改變的CapsLock鍵的狀態。用另一種方法,它會關閉CAPS LED,但這個甚至沒有產生這種效果。 – HeWhoWas

+0

讓我修改那條語句。完全按照您寫的代碼使用代碼解決了問題。 我打電話SendKeys.SendWait( 「{} CAPSLOCK」);然後在另一行發送字符串。關鍵在於讓CAPSLOCK在與發送的其他文本相同的SendKeys語句中切換。謝謝! – HeWhoWas

+0

原因是,在第一個Sendkey完成後,Sendkey中的CAPSLOCK會導致發送額外的CAPSLOCK。添加一些調試寫入看看會發生什麼。 – Martin

0

我有一個應用程序,我經常需要在左SHIFT和TAB之間切換。在我的鍵盤上,CAPSLOCK位於這兩個鍵之間,我偶爾會錯誤地輸入CAPSLOCK而不是TAB。我的解決方案是反向CAPSLOCK並提交一個TAB。令我驚訝的是,程序循環直到堆棧溢出。我發現CAPSLOCK鍵發送兩次。這是我的最終解決方案:

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