Autohotkey:使用 Space + Alt + q 触发操作

Autohotkey:使用 Space + Alt + q 触发操作

我在自动热键脚本,我想
在按下SPACE+ Alt+时运行它Q

我该怎么做?

我读过space一些问题,因为它已经被 AHK 用来确认缩写或类似的东西,但我确实不使用缩写。

~Space & j::
   If GetKeyState("Alt") = 0
           Send {Left}
   Else
           Send +{Left}
Return

您有什么建议?

现在我正在尝试从 AHK 论坛获得这个,到目前为止,它允许我连续运行脚本而无需释放空格键

; THIS IS THE FIRST PART OF MY SCRIPT, ITS FOR THE e, +e, d, +d HOTKEYS...
ARprecColPickerFn(a, b, c)
{
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 2)
return

+e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
return

d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
return

+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return


; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::
    KeyWait,Space,T0.2
    If (ErrorLevel)
    {
        HotstringsEnabled:=true
        KeyWait,Space
        HotstringsEnabled:=false
    }
        else
        Send {Space}    
Return
#If HotstringsEnabled
#Hotstring *

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

!e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
return

d:
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

!d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -2)
#If

到目前为止,该脚本运行良好,但我遇到了一个问题。脚本的第一部分,使用“d”作为热键的部分,每当我按“space + d”时就会触发它,我怎样才能使这两个操作共存?(一个由“d”触发,另一个由“space & d”触发)请任何可以检查它的 AHK 超级用户检查一下,非常感谢。

顺便问一下,这是什么意思...

#Hotstring *

已编辑>>>>

在 Autohotkey 脚本中,我想要Space Alt E加五、Space Alt D减五、Space E加十、Space D减十。

我想连续快速地加或减,因此我想按住Space Alt然后在按下E或时发生不同的事件D。例如,SpaceHoldDown AltHoldDown Edown Eup Edown Eup Edown Eup将 ADD FIVE 3 次。

另外,有时我会先按下Space然后Alt(为了在按下ED添加或减法之前按住它们),而其他时候我会先按下Alt然后Space,但无论哪种情况,我都希望在按下ED之后获得相同的结果。这是我当前的脚本无法做到的,这意味着我总是必须小心先按下Space然后Alt按下ED才能使脚本工作,因为如果我先按下Alt然后Space它就不会工作。我希望脚本能够工作,无论以何种顺序SpaceAlt键按下。

最后,我需要SpaceKey 来保留其原生功能(不被阻止),因为它用于在应用程序中导航。

目前,该脚本可以让我连续按住Space AltED以多次添加或减法,但它存在一个问题,即我必须先按下SpaceAlt否则它将不起作用,而且整个脚本必须放在我的 AHK 脚本的最末尾,否则它会干扰其他子程序。

最后一次编辑,我根据 JJHONSTON2 的答案尝试的代码......

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")

    #If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))
        q::
            msgbox you typed Alt Space Q
    #If
#If    <----- do I need to put a second #If (turn off context sensitivity)?

但它不起作用。

经过测试,我意识到我必须使用#If而不是,If因为后者只有在我按下 Q 之后按下 Alt 和 Space 时才会触发子程序。

但是使用#If不允许我使用 && 操作数测试 2 个键。请问有人知道如何使用#If GetKeyState带有 2 个键SpaceAlt

请注意,我确实需要能够按住spacealt多次按下和释放 Q 才能连续添加 10,这非常重要,这就是为什么下面这样的解决方法没有用,因为它迫使我在子程序之间释放altspace(多次运行)

#If GetKeyState("Space", "P")
!q::    ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

#If GetKeyState("Alt", "P")
Space & q:: ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

提前致谢。

答案1

我之所以继续发帖是因为您继续尝试不同的建议和组合,而不仅仅是要求别人编写您的脚本。

我将复制/粘贴/修改几个按键定义示例,希望让您了解可以实现此目的的不同方式(可能已经提到过,也可能没有提到过),并希望让您更好地理解可以使用的各种逻辑组合,而不仅仅是解决您的特定按键组合问题。希望如果我不直接解决它,您能够弄清楚。

例如:仅当按下空格键时才触发。

#If GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed
q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
#If

示例:热键代码中的多个修饰符检查的特定触发器。

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers.  q keypress is discarded.

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

示例:手动发送按键(即热键修饰符过滤)

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P")) {
        SendInput {Blind}q      ; send q keystroke and allow any pressed modifiers to stay in tact.  If Control is down, Control+q will get sent
        Return  ; continue no further unless Alt+Space are also pressed.  
    }

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

示例:无论您是否执行操作,按键都会被发送到程序。

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
~*q::       ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress has already passed through to program

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

示例:单个热键中的多个定义/操作(有效但不推荐实施)。

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !GetKeyState("Space", "P")
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    If (GetKeyState("Alt", "P") {
        ToolTip % "Alt+Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    }
Return

您可以区分热键定义中的键并有选择地执行不同的代码集,但一般的最佳做法可能是使用#If语句来确定热键代码的执行时间。

不要#If's连续使用两个...热键定义由#If热键定义语句之前的最后一个连续语句决定...

; Do Not Use...
#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
#If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))    ; this voids the #If statement above

应该如下所示。

; If ahk_class xxx or yyy, and if Alt+Space is also pressed...
#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  && (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))   
; ...
; code goes here
; ...
#IfWinActive ; this sets context for the next hotkeys back to default; only one statement needed; indentation is irrelevant

请注意,根据需要使用分组括号来进行逻辑 OR/AND 组合......在某些情况下,可以不用它们,但是在混合 AND 和 OR 时要小心地组合语句。

由于布尔运算符被识别为延续最后一行,因此该语句也可以自动延续两行(为了风格/可读性)......

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  
&& (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
;q::    ; q hotkey without modifiers will never trigger here because Alt must be down to get this far
!q::    ; this will trigger
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

示例:拆分处理(内部/外部热键定义)(可行但不推荐实施)

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
!q::
    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

示例:热键定义内的所有处理(可用但不推荐实现)

!q::
    If !(WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
        Return

    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

最后的例子是根据需要在热键之间拆分代码,#If并向下选择语句以始终保持某个类窗口处于活动状态并且按下空格键......

#Persistent
Return


#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY")) 
 && GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed

;!Space::Return     ; Optional. Kill the window system menu if present

q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return

d::
    ToolTip % "Space+d pressed..."
    Sleep 500
    ToolTip
Return

!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

Space请注意,这不会使或作为独立按键的使用无效Alt+Space。例如,如果您按下Space然后Alt按下热键,它将Space在执行Alt+hotkey代码之前发送一个。同样,如果您按下Alt+Space(例如在普通窗口中),它将触发左上角的系统窗口(恢复/移动/大小/最小化/最大化/关闭)。热键功能仍然有效,但下拉菜单可能会很烦人(如果您不在已经排除此菜单的工具窗口中),在这种情况下,您还可以添加一个!Space::Return函数来终止功能,Alt+Space同时保留热键。在这种情况下,它应该添加到上下文块(相关#If语句)中,以便它仅适用于该特定窗口。

还有多种其他方法可以让代码针对这些组合键执行,而无需使用 GetKeyState()(如其他一些答案中所述)——我不会重复这些信息。您应该能够获得一些答案组合来执行您想要的操作。

答案2

尝试这个

Space:: Send {Space}

Space & j::
If GetKeyState("Alt")
   Send +{Left}
else
   Send {Left}
Return

Space & e::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

Space & d::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

    ARprecColPickerFn(a, b, c){
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

答案3

我认为你只能用激活键来启动热键!{alt}, +{shift}, ^{ctrl}, win{#}。你可以尝试以下方法:

#if getKeyState("space")
!q:: run notepad.exe
#if

这将启动notepad.exe但它将首先运行space按钮。

答案4

回应更新的帖子...

如果您要使顶部热键以不按下空格键为条件,则按住空格键时热键不会触发。随着脚本的进展,这也需要“撤消”,因此还会有一个 #IfWinActive 语句使此条件不适用于下面的其他热键定义。

脚本的顶部看起来像这样...

#If !GetKeyState("Space", "P")
+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return

#IfWinActive
; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::

对于另一个问题...

#Hotstring *

...这会使 * 选项对代码中此行之后定义的所有热字符串产生影响。

来自#Hostring帮助主题:

*(星号):无需结束字符(例如空格、句点或回车)即可触发热字符串。例如:

:*:j@::[email protected]

回到您正在工作的总体架构,我只会#If对所有热键使用条件,正如 IGRACH 所指出的那样,并取消启用/禁用热键的复杂空间检测循环。

相关内容