AutoHotkey で 3 つ以上の修飾キーを使用して TouchCursor スペーストリガーを複製する

AutoHotkey で 3 つ以上の修飾キーを使用して TouchCursor スペーストリガーを複製する

再現しようとしていますタッチカーソルAutoHotkey を使用してキーを操作していますが、複数の修飾子を使用すると動作しません。

これまでのところはこんな感じです(https://autohotkey.com/boards/viewtopic.php?t=6525):

space & g::Send, {esc}
space & l::send, {right}
space & k::send, {up}
space & j::send, {down}
space & h::send, {left}
space & p::send, {backspace}
space & m::send, {delete}
space & u::send, {home}
space & o::send, {end}
space::
Send, {space}
return

上記のスクリプトは、「h」、「j」、「k」、「l」を使用してカーソルを移動するのに正常に機能しますが、controlキーは無視されますshift

たとえば、+ +と同様に、左側を強調表示するためにspace+ shift+を使用して文字を強調表示することを期待していました。hspaceshiftleft arrow

試してみました+space & h::send, {left}が、次のエラーが発生しました:

ここに画像の説明を入力してください

編集

このスクリプトは および で動作しcontrolますshift:

; Right, Shift+Right, Control+Right, Shift+Control+Right
space & l::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{right}
    } else if(GetKeyState("Shift", "P")) {
        send, +{right}
    } else if(GetKeyState("Control", "P")) {
        send, ^{right}
    } else {
        send, {right}
    }
Return

; Up, Shift+Up, Control+Up, Shift+Control+Up
space & k::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{up}
    } else if(GetKeyState("Shift", "P")) {
        send, +{up}
    } else if(GetKeyState("Control", "P")) {
        send, ^{up}
    } else {
        send, {up}
    }
Return

; Down, Shift+Down, Control+Down, Shift+Control+Down
space & j::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{down}
    } else if(GetKeyState("Shift", "P")) {
        send, +{down}
    } else if(GetKeyState("Control", "P")) {
        send, ^{down}
    } else {
        send, {down}
    }
Return

; Left, Shift+Left, Control+Left, Shift+Control+Left
space & h::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{left}
    } else if(GetKeyState("Shift", "P")) {
        send, +{left}
    } else if(GetKeyState("Control", "P")) {
        send, ^{left}
    } else {
        send, {left}
    }
Return

; Home, Shift+Home, Control+Home, Shift+Control+Home
space & u::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{home}
    } else if(GetKeyState("Shift", "P")) {
        send, +{home}
    } else if(GetKeyState("Control", "P")) {
        send, ^{home}
    } else {
        send, {home}
    }
Return

; End, Shift+End, Control+End, Shift+Control+End
space & o::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{end}
    } else if(GetKeyState("Shift", "P")) {
        send, +{end}
    } else if(GetKeyState("Control", "P")) {
        send, ^{end}
    } else {
        send, {end}
    }
Return

; Backspace, Shift+Backspace
space & p::
    if(GetKeyState("Control", "P")) {
        send, ^{backspace}
    } else {
        send, {backspace}
    }
Return

; Simple modifiers
space & g::Send, {esc} 
space & m::send, {delete}

; Allow space bar to go through if pressed without holding
space::
Send, {space}
return

答え1

使用する必要がありますif文とともにキーステートを取得追加の修飾子をキャプチャする関数。具体的には、修飾子Pの (物理的な状態)を見つけますshift

たとえば、次のspace & h組み合わせ:

space & h::
    if(GetKeyState("Shift", "P")) {
        send, +{left}
    } else {
        send, {left}
    }
Return

おそらく、さらに一歩進んで、ctrl修飾子も実装したいと思うでしょう。if ステートメントを拡張し、if ステートメントの実行方法に注意する必要があります。

space & h::
    if((GetKeyState("Shift", "P") and (GetKeyState("Control", "P")))) {
        send, +^{left}
    } else if(GetKeyState("Shift", "P")) {
        send, +{left}
    } else if(GetKeyState("Control", "P")) {
        send, ^{left}
    } else {
        send, {left}
    }
Return

Shiftまずとのキー状態をチェックしControl、次に個々の修飾子をチェックする必要があります。そうしないと、終了が早すぎて、修飾子の 1 つしか実行されなくなります。

関連情報