Autohotkey - GetKeyState bricht ab, wenn eine neue Taste gedrückt wird

Autohotkey - GetKeyState bricht ab, wenn eine neue Taste gedrückt wird

Ich versuche, ein Skript zu erstellen, das die Leertaste drückt, solange sie physisch gedrückt ist. Wenn ich beispielsweise die Leertaste gedrückt halte, repliziert das Skript Leerzeichen mit Send. Sobald ich die Leertaste loslasse, sendet es keine Leerzeichen mehr. Das habe ich mit diesem Skript erreicht

#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

Dies funktioniert, aber wenn ich eine neue Taste drücke, während ich die Leertaste drücke, GetKeyState("Space")gibt das aus irgendeinem Grund „false“ zurück. Das Skript startet derzeit ordnungsgemäß, aber das Drücken einer anderen Taste ist dasselbe wie das Loslassen der Leertaste, was ich nicht möchte.

Da dachte ich mir, vielleicht Inputkann mir jemand helfen. Nun, es funktionierte wieder, aber sobald ich eine andere Taste drückte, hörte es auf.

Hier ist, was ich versucht habe und Inputdas im Vergleich zum ersten Sample, das ich ausprobiert habe, die gleichen Ergebnisse erbracht hat (mit zeitlichen Abweichungen).

#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

Auch dies schlägt fehl, da das Drücken einer neuen Taste intern das Drücken meiner Leertaste aufhebt.

Ich würde versuchen, Keybinding-Ereignisse wie auszuführen Space::, aber es würde auch von den Befehlen ausgelöst Send, wodurch eine Endlosschleife entsteht. Und ich möchte keine andere Taste als die Leertaste drücken, da mehrere meiner Tasten an irgendetwas gebunden sind.

Es fühlt sich an wie Filtertasten oder klebrige Tasten, denn selbst ohne Autohotkey wird die Leertaste freigegeben, wenn eine andere Taste gedrückt wird. Aber beide Funktionen sind deaktiviert. Und es ist nicht nur die Leertaste. Jede gedrückte Taste wird freigegeben, sobald eine neue Taste gedrückt wird. Filtertasten machen genau das, was ich verhindern möchte, aber es gibt sozusagen keine „umgekehrten Filtertasten“. Ist es möglich, mit dieser Hardwarebeschränkung auszukommen? Wie kann ich Autohotkey so zum Laufen bringen, dass es erkennt, dass ich die Leertaste gedrückt halte, selbst nachdem eine neue Taste gedrückt wurde?

Antwort1

Das ist zwar alt, könnte aber in Zukunft Menschen mit dem gleichen Problem helfen.

Anstatt den physischen Zustand des Schlüssels zu GetKeyState("Space")überprüfenGetKeyState("Space", "P")

Antwort2

Wenn nach der Leertaste eine andere Taste gedrückt wird, erfasst GetKeyState die Leertaste nicht mehr. Es ist, als ob Sie „A“ spammen, indem Sie es lange drücken, und dann „B“ lange drücken, ohne „A“ loszulassen. Sie erhalten nicht „aaaababab“, sondern nur „aaabbbbb“. Ich verstehe nicht, was Sie versuchen, wenn Sie eine andere Taste drücken, während Sie die Leertaste drücken (es könnte sein, dass Sie eine Kombination aus Spammen wollen?), aber ich glaube, dass das, was Sie erreichen wollen, nicht möglich ist.

verwandte Informationen