Программно отключить заглавные буквы - PullRequest
5 голосов
/ 01 ноября 2011

Я использую 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");

Который вообще не работал.

Ответы [ 2 ]

9 голосов
/ 01 ноября 2011

это у вас работает?

    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 голосов
/ 10 февраля 2018

У меня есть приложение, в котором мне часто нужно переключаться между левым SHIFT и TAB. На моей клавиатуре CAPSLOCK находится между этими двумя клавишами, и я время от времени ошибаюсь, печатая CAPSLOCK вместо TAB. Мое решение состоит в том, чтобы отменить CAPSLOCK и вместо этого отправить вкладку. К моему удивлению, программа зацикливается до переполнения стека. Я узнал, что 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
...