スペースボタンが物理的に押されている限り、スペースボタンを押すスクリプトを作成しようとしています。たとえば、スペースバーを押し続けると、スクリプトはスペースを複製します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" と表示されるのと同じです。スペースバーを押すときに別のキーを押すと何をしようとしているのかわかりません (スパムの組み合わせを希望している可能性があります)。ただし、実現しようとしていることは不可能だと思います。