AHK Альтернативная клавиша при длительном нажатии - PullRequest
3 голосов
/ 03 мая 2019

У меня есть клавиатура с этими стрелками (меньше / больше чем) в качестве альтернативных клавиш Y и X.

Keyboard

Давайте сосредоточимся надля этого примера нажмите клавишу X.

По умолчанию альтернативный символ> запускается, конечно же, с помощью AltGr + X.

Но я хотел бы вызвать его простым длительным нажатием X, чтобы ускорить процесси не нуждаясь во второй руке или пальце.

Пока у меня есть следующее, что я получил из других постов:

$x::
    KeyWait, x, T0.2

    if (ErrorLevel)
        Send > ;long

    else {
        KeyWait, x, D T0.2

        if (ErrorLevel)
            Send x ;single
    }

    KeyWait, x
return

Это в основном работает, но имеет один существенный недостаток:Обычное нажатие одной клавиши теперь занимает слишком много времени, чтобы написать нормальный символ X.

Например, если вы быстро напишите такое слово, как «exchange», вы получите что-то вроде «echxange», потому что Xотправка занимает слишком много времени.

Так как же можно изменить этот скрипт, чтобы решить эту проблему?Моя идея состояла бы в том, чтобы отправить нормальный X и прервать весь этот сценарий, как только зарегистрирован {X Up}.Таким образом, после {X Up} он больше не будет ждать.

Или любая другая идея?

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Вот решение, которое рассчитывает продолжительность нажатия клавиши, недостатком является то, что вам всегда нужно отпустить клавишу, чтобы получить требуемый ввод.Это означает, что вы не можете удерживать x для ввода xxxxxxxx.

$x::
    startTime := A_TickCount ;record the time the key was pressed
    KeyWait, x, U ;wait for the key to be released
    keypressDuration := A_TickCount-startTime ;calculate the duration the key was pressed down
    if (keypressDuration > 200) ;if the key was pressed down for more than 200ms send >
    {
        Send > 
    }
    else ;if the key was pressed down for less than 200ms send x
    {
         Send x 
    }

return
1 голос
/ 03 мая 2019

Код ниже, кажется, работает хорошо для меня, но обратите внимание, что есть вероятность (с некоторыми неудачными временами), что он мог бы ошибочно заменить «x», если вы печатаете много х подряд, приводя к чему-то вродеэто "хххх> ххх".Я увеличил время ожидания до 350 мс, чтобы сделать этот сценарий менее вероятным, но об этом нужно знать, и его следует изменить в соответствии с вашими потребностями.

~x::
Sleep , 350
BlockInput , On
Send , % GetKeyState( "x" , P ) ? "{backspace}>" : ""
KeyWait , x , U
BlockInput , Off
Return

Обратите внимание, что, поскольку он отправляет клавишу возврата, вы можетеПолучите непредвиденные результаты, если используете его в нетипизированной среде, например в браузере, где он может вернуться на предыдущую страницу, если вы не можете набирать текст.Это может быть смягчено, если необходимо, отфильтровав эти конкретные сценарии с помощью WinActive или чего-то подобного.

0 голосов
/ 18 мая 2019

Довольно просто, но для этого потребуются 2 отдельных скрипта.
Сначала запустите этот скрипт, чтобы заблокировать повторение (я почти уверен, что это то, что вы хотите).

SendMode Input 

$x::
    send {x}
    keywait, x
    send {x up}
return

Затем запустите этот второй скрипт, который выполняет логику:

SendMode Input 

dt := 30            ;  milliseconds time resolution
timeout := 1500 ;  timeout

loop 
{
    sleep %dt%                      ; sleep to reduce CPU usage
    p := getkeystate("x", "P")          ; getkeystate
    if (p = 1) {
        timer += dt
    }
    if (p = 0) {
        timer := 0
    }
    ; tooltip pressed:  %p%  timer: %timer%
    if (timer > timeout) {
        send {backspace}
        send {>}
        timer := 0              ; reset timer
    }
}

Он будет вводить x в обычном режиме и > через 1,5 секунды, см. Переменную timeout. Хитрость в том, что в последнем случае он удаляет последний x, поэтому вы получаете только >.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...