Joshua
Joshua

Reputation: 6843

AutoHotKey key SEQUENCE, not just single-key hotkey

I'm not stupid... really. How do you map a key SEQUENCE (ie: Ctrl + Q , F) in AutoHotKey.

I've got Ctrl + Q down:

^q::

I've even got F:

f::

The examples in the help files even show how to do two keystrokes in a row:

Numpad0 & Numpad1::

But it just will not work with:

^q & f ::

Or any of these either:

LCtrl & q & f::
^q & ^f::
^q^f::
^qf::

How do I accomplish a Key SEQUENCE triggering something, when one of those keys is the Ctrl key? I looked into using a HOTSTRING instead, but couldn't work out how to include the Ctrl character, in that context!

Upvotes: 35

Views: 17411

Answers (5)

Relax
Relax

Reputation: 10543

AutoHotkey v1:

#Requires AutoHotkey v1.1.33

^q:: ctrl_q := true ; assign the Boolean value "true" or "1" to this variable
^q up:: ctrl_q := false

; The #If directive creates context-sensitive hotkeys:

#If (ctrl_q) ; If this variable has the value "true"

    ^a:: MsgBox, Ctrl + Q + A
    
    ^b:: MsgBox, Ctrl + Q + B

    ; ...
    
#If

AutoHotkey v2:

#Requires AutoHotkey v2.0

^q:: ctrl_q := true ; assign the Boolean value "true" or "1" to this variable
^q up:: ctrl_q := false

; The #HotIf  directive creates context-sensitive hotkeys:

#HotIf (ctrl_q := true ) ; If this variable has the value "true"

    ^a:: MsgBox "Ctrl + Q + A"
    
    ^b:: MsgBox "Ctrl + Q + B"

    ; ...
    
#HotIf

Upvotes: 0

Andrew Cheong
Andrew Cheong

Reputation: 30273

In case someone's looking for a similar thing, but actually want CtrlQ + CtrlF and only if Ctrl is held throughout (so, to some, this might seem like CtrlQ + F), then here's how to do that:

$Ctrl::Send {Ctrl Down}
$Ctrl UP::
    ChordIsBroken := True
    Send {Ctrl Up}
    Return
^q::
    ChordIsBroken := False
    Input, OutputVar, L1 M
    If (!ChordIsBroken && Asc(OutputVar) = 6)
    {
        MsgBox "Hello, World!"
    }
    Else
    {
        SendInput %OutputVar%
    }
    Return

See https://superuser.com/a/725303/145431 for my explanation.

Upvotes: 5

lance
lance

Reputation: 16342

This catches CTRL+F. If Q is held down at that moment, your code fires.

^f::
    If GetKeyState("q", "p") {
        MsgBox test
    } Else {
        Send ^f
    }
return

Upvotes: 1

Ciantic
Ciantic

Reputation: 5764

Or you can do it like this:

q & f::
    if GetKeyState("Control") {
        ; Do something
        return
    }
    return

I think this is a bit more readable than using Input Key, L1 as in above.

Upvotes: 2

Joshua
Joshua

Reputation: 6843

Alright; The answer seems to be:

^q::
Input Key, L1
if Key=f
...some code here...
return

Upvotes: 32

Related Questions