34
votes

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!

4

4 Answers

30
votes

Alright; The answer seems to be:

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

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.

2
votes

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.

1
votes

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