以编程方式禁用大写锁定

7

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

其中之一是,当我使用SendKeys.Send("Test")时,如果大写锁定处于打开状态,它将产生"tEST"而不是"Test"。

我使用以下代码来尝试检测大写锁定状态,并在必要时切换它:

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

这仍然显示为:"tHIS iS aN oVER cAPITALIZED tEST sTRING"。

有没有办法解决这个问题?

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

解决的。

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

我最初尝试使用:

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

这根本没有起作用。


1
如果您执行 SendKeys.Send"{CAPSLOCK}Test" 会发生什么? - V4Vendetta
2个回答

12

这对你起作用吗?

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

我刚刚测试了一下,它根本不会改变大写锁定键的状态。使用另一种方法,它会关闭大写锁定键的LED灯,但是这种方法甚至连那个都没有产生。 - HeWhoWas
让我撤回那个声明。使用你写的代码确实解决了问题。我曾经在一行中调用SendKeys.SendWait("{CAPSLOCK}"); 然后在另一行发送字符串。关键在于将CAPSLOCK切换与发送其余文本的部分放在同一条SendKeys语句中。谢谢! - HeWhoWas
原因是在Sendkey中使用大写锁定键会导致在第一个Sendkey完成后发送额外的大写锁定键。添加一些调试输出以查看发生了什么。 - 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

如何在C# WPF中编写此代码? - Starwave
@Starwave 像这样吗?(我个人不使用 wpf):https://dev59.com/4mgu5IYBdhLWcg3wGjdF - Martin
谢谢,那个方法也可能行(最终采用了完全不同的方法) - Starwave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接