【问题标题】:Programmatically disable caps lock以编程方式禁用大写锁定
【发布时间】:2011-12-19 05:14:44
【问题描述】:

我在自动化程序中使用 SendKeys 进行工作。我一直在努力,现在正在努力解决我创建的所有错误:-)

其中之一是,当我使用 SendKeys.Send("Test") 时,如果 CapsLock 打开,它将产生“tEST”而不是“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");

仍然显示为:“这是一个大写的测试字符串”。

有什么办法可以解决这个问题吗?

回答!只是为了向其他人澄清,问题已通过使用

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

我第一次尝试使用:

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

这根本不起作用。

【问题讨论】:

  • 如果你这样做SendKeys.Send"{CAPSLOCK}Test" 会怎样?

标签: c# sendkeys capslock


【解决方案1】:

这对你有用吗?

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

【讨论】:

  • 我刚刚测试了这个,它根本不会改变 CapsLock 键的状态。使用另一种方法,它会关闭 CAPS LED,但是这个甚至不会产生这种情况。
  • 让我编辑该声明。完全按照您编写的代码使用代码解决了问题。我打电话给 SendKeys.SendWait("{CAPSLOCK}");然后在另一行上发送字符串。关键在于在与您发送的其余文本相同的 SendKeys 语句中切换 CAPSLOCK。谢谢!
  • 原因是 Sendkey 中的 CAPSLOCK 会导致在第一个 Sendkey 完成后发送额外的 CAPSLOCK。添加一些调试写入,看看会发生什么。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2011-12-09
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多