1

いくつかのキーを送信するホットキーを作成し、次に送信されたばかりのキーの別のホットキーを作成して、3 番目のキーを送信したいと考えています。

を使用して、それは可能であるようです#InputLevel

#InputLevel 1
a::b
#InputLevel 0
b::c

上記は意図したとおりに機能します。 aを押すと、 cが表示されます。

ただし、最初のキーを再マップするだけでなく、キーを送信する前にもっとや​​りたいことがあります。だから私は上記を少し書き直すことができると思った:

#InputLevel 1
Hotkey *a, foo
#InputLevel 0
b::c

foo:
    ; Do something more here …
    SendInput {Blind}b
    return

ただし、上記は意図したとおりに機能しません。 a を押すと、b ( cではありません)が取得されます。

Hotkey更新: @Robert Ilbrink は、コマンドを使用せずに複数のコマンドを実行できることを思い出させてくれました。

#InputLevel 1
*a::
    ; Do something here …
    SendEvent {Blind}b
    return
#InputLevel 0
b::c

上記は意図した効果をもたらします: aを押すとcになります。ただし、問題を言い換える必要があります。問題は次のとおりだと思います。ホットキーを動的に設定する必要があるため、Hotkey(私の知る限り)ラベル付きのコマンドを使用する必要があります。SendEvent(上記で使用していることにも注意してください。使用するとa b . OddSendInputが生成されます。)

(更新終了。)

#InputLevel<a href="http://l.autohotkey.net/docs/commands/SendLevel.htm" rel="nofollow">の関連コマンドがあることは知っていSendLevelます。いろいろなところに入れてみましたが、全然違います。

つまり、それは縮小された理論上の例でした。もちろん、a を b から c に再マッピングすることは、実際には役に立ちません (もちろん、最終的な結果は によって達成できますa::c)。私のユースケースに進みます。「本当の」解決策が、私がやろうとしていることを別の方法で実行することを意味することが判明した場合でも、私はもっと知りたいと思っていることに注意して#InputLevelくださいSendLevel.

デュアルロール修飾キーの実装に取り​​組んでいます。たとえば、RShiftを単独で押すと)を送信しますが、他のキーと一緒に押すとRShift+キーを送信します。基本的に、キーダウンで RShift、キーアップでRShift up)です。ただし、これには 1 つの欠点があります。RShiftを他のキーと組み合わせても、)が送信されます。そのため、スクリプトは、いつ組み合わせがあったかを知る必要があります。私の解決策は、次のように、すべての文字キー、矢印キー、およびその他のキーにホットキーを追加することです。

for comboKey in filteredComboKeys {
    Hotkey % "*" comboKey, Dual_comboKey
}

; Later in script:

Dual_comboKey:

    ; The following function lets the dual-role modifier keys know that they have 
    ; been combined with another key (and a few other things, which I don't think
    ; are important for the issue.)
    Dual.combo() ; 

    key := Dual.cleanKey(A_ThisHotkey)
    SendInput {Blind}%key%

    return

上記の解決策は、ユーザーが行った可能性のあるすべての再マッピングとその他のホットキーを中断することを除いて、私の目的には非常にうまく機能します。これらはまったく発生しません。

4

3 に答える 3

3

なぜだめですか:

a::
; Do something
Send, b
Return
于 2013-06-25T12:31:41.867 に答える