Autohotkey - GetKeyState прерывается при нажатии новой клавиши

Autohotkey - GetKeyState прерывается при нажатии новой клавиши

Я пытаюсь создать скрипт, который нажимает кнопку пробела, пока она физически нажата. Например, если я удерживаю пробел, скрипт будет копировать пробелы с помощью Send. Как только я отпускаю пробел, он прекращает посылать пробел. Я добился этого с помощью этого скрипта

#NoEnv
#SingleInstance Force
SendMode Input
loop {
    if (GetKeyState("Space"))
    {
        Send {Space down}
        Random, r, 5, 15
        Sleep, %r%
        Send {Space up}
    }
    Random, r, 5, 10
    Sleep, %r%
}
Esc::
ExitApp
return

Это работает, однако, если я нажму новую клавишу, удерживая клавишу пробела, то GetKeyState("Space")по какой-то причине вернет false. В настоящее время скрипт запускается правильно, но нажатие любой другой клавиши равнозначно отпусканию пробела, а это не то, что мне нужно.

И тогда я подумал, может, Inputмне поможет. Ну, опять же, это сработало, но как только я нажал другую клавишу, это остановилось.

Вот что я попробовал и Inputчто дало те же результаты (со смещением по времени) относительно первого образца, который я попробовал.

#NoEnv
#SingleInstance Force
SendMode Input
loop {
    Input, OutputVar, B I L4 T0.05 V ; Had to keep it a low timeout due to the nature of the script
    if (InStr(OutputVar, Chr(32)))
    {
        Send {Space down}
        Random, r, 5, 15
        Sleep, %r%
        Send {Space up}
    }
    Random, r, 5, 10
    Sleep, %r%
}
Esc::
ExitApp
return

Это также не срабатывает, поскольку нажатие новой клавиши внутренне освобождает мою клавишу пробела от нажатия.

Я бы попробовал сделать события привязки клавиш, например Space::, но это также будет вызвано Sendкомандами, создавая бесконечный цикл. И я бы не хотел нажимать никакую другую клавишу, кроме пробела, так как несколько моих клавиш привязаны к чему-то или чему-то еще.

Это похоже на фильтрующие клавиши или залипающие клавиши, потому что даже без autohotkey пробел отпускается после нажатия любой другой клавиши. Но обе эти функции отключены. И дело не только в пробеле. Любая удерживаемая клавиша отпускается, как только нажимается новая клавиша. Фильтрующие клавиши делают именно то, что я пытаюсь предотвратить, но нет «обратных фильтрующих клавиш», так сказать. Можно ли обойтись с этим аппаратным ограничением? Как мне заставить autohotkey работать в том смысле, чтобы он видел, что я удерживаю пробел, даже после нажатия новой клавиши?

решение1

Это старый способ, но он может помочь людям в будущем с той же проблемой.

Вместо GetKeyState("Space")использования GetKeyState("Space", "P")для проверки физического состояния ключа

решение2

Когда после пробела нажимается другая клавиша, GetKeyState больше не захватывает пробел. Это как если бы вы спамили "A" долгим нажатием, а затем продолжали долго нажимать "B", не отпуская "A", вы не получили бы "aaaababab", а просто "aaabbbbb". Я не понимаю, что вы пытаетесь сделать, когда нажимаете другую клавишу, когда нажимаете пробел (может быть, вы хотите комбинацию спама?), но я считаю, что то, чего вы пытаетесь добиться, невозможно.

Связанный контент