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、無限ループが作成されます。また、いくつかのキーが何かにバインドされているため、スペース以外のキーを押したくありません。

フィルター キーまたはスティッキー キーのように感じます。なぜなら、オートホットキーがなくても、他のキーを押すとスペース バーが解放されるからです。しかし、これらの機能は両方ともオフになっています。そして、スペース バーだけではありません。保持されているキーは、新しいキーが押されるとすぐに解放されます。フィルター キーはまさに私が防ごうとしていることを実行しますが、いわゆる「逆フィルター キー」はありません。このハードウェア制限を回避することは可能ですか? どうすれば、新しいキーが押された後でもスペース キーが保持されていると認識するという意味においてオートホットキーを機能させることができますか?

答え1

これは古いものですが、将来同じ問題を抱えている人々の役に立つかもしれません。

キーの物理的な状態を確認するためにGetKeyState("Space")使用する代わりにGetKeyState("Space", "P")

答え2

スペースバーの後に別のキーが押されると、GetKeyState はスペースバーをキャプチャしなくなります。これは、"A" を長押ししてスパムしているときに、"A" を放さずに "B" を長押しすると、"aaaababab" ではなく "aaabbbbb" と表示されるのと同じです。スペースバーを押すときに別のキーを押すと何をしようとしているのかわかりません (スパムの組み合わせを希望している可能性があります)。ただし、実現しようとしていることは不可能だと思います。

関連情報