Как я могу обнаружить одновременное нажатие двух клавиш в autohotkey? - PullRequest
2 голосов
/ 31 мая 2019

Я изо всех сил пытаюсь найти решение, которое обнаруживает одновременное нажатие f и j, чтобы при нажатии только f или j текущее приложение также получало f или * 1006.* но когда я нажимаю f и (в течение короткого периода времени) j одновременно, что текущее приложение не получает ни одной клавиши.

Я понимаю, что мне как-то приходится ждать короткий период времени (возможно,0,2 секунды) после обнаружения f или j, чтобы определить, следует ли мне использовать send для передачи нажатых f или j текущему приложению или если мне нужно "проглотить" оба ипродолжить с моим макросом.Тем не менее, как я должен к этому, я понятия не имею.

1 Ответ

2 голосов
/ 02 июня 2019

Относительно простое решение состоит в том, чтобы обнаружить комбо напрямую, не блокируя ввод для этих двух клавиш. Как только он обнаружит, что нажаты обе клавиши, удалите результаты ввода, дважды нажав клавишу backspace, а затем выполните нужную команду. Преимущество этого заключается в том, что вы все равно можете набирать текст без проблем.
OTOH это будет работать правильно только в случае, когда текущий фокус находится на приложении / виджете для ввода текста и где backspace означает удаление последнего символа. В других случаях вы можете получить некоторые сюрпризы, например, активация случайных команд.
Вот пример, я использовал клавиши x и c здесь. Место, где запускается команда - это линия send {O}.

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

dt := 30            ;  milliseconds sleep
k1name := "x"       ;  key 1
k2name := "c"       ;  key 2

loop 
{
    sleep %dt%                              ; sleep to reduce CPU usage
    k1 := getkeystate(k1name, "P")          ; get key 1 state
    k2 := getkeystate(k2name, "P")          ; get key 2 state

    if ( ! ( getkeystate("Ctrl", "P") || getkeystate("Alt", "P") || getkeystate("Shift", "P") ) ) {
        if ( k1 && k2 && !trig ) {
            send {backspace 2}
            send {O}        ; send some command 
            trig := 1       ; set flag to avoid repetition
        }
        if ( !k1 || !k2 ) {
            trig := 0
        }
    }
}

Могут также быть решения с переопределением поведения этих клавиш, но это будет более сложным и имеет проблемы, уже упомянутые в комментариях. Я лично склонен придерживаться вышеуказанного решения из-за его простоты.

...