编程方式禁用大写锁定

问题描述:

我使用的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

这是否对你的工作?

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

我有一个应用程序,我经常需要在左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