如何在AutoHotkey中将多个类似的热键压缩为一个?

时间:2016-03-13 11:01:58

标签: autohotkey

我正在尝试创建热键来模拟我正在玩的在线游戏中的输入缓冲,这本身并不支持输入缓冲,这意味着将拼写密钥捣碎以使其在前一个咒语完成投射后熄灭是手动做的最佳方法。

在热键的帮助下,我可以通过按住我的按键以最小的延迟循环按下按键,以便它在我完成施放前一个咒语的瞬间发送。

但是为每个按钮创建了多个热键,我已经将键盘绑定到一个咒语上,这似乎很乏味,我不知道如何使用已定义键的数组(即1到6,以及F1到F6)

到目前为止我的代码示例代码段只考虑了3个键:

$5::
{
    Loop
    {
        Loop, 5
        {
            Send, 5
            Sleep, 1
        }
        GetKeyState, state, 5
        if state = U
            break
    }
    return
}

$2::
{
    Loop
    {
        Loop, 5
        {
            Send, 2
            Sleep, 1
        }
        GetKeyState, state, 2
        if state = U
            break
    }
    return
}

$F2::
{
    Loop
    {
        Loop, 5
        {
            Send, {F2}
            Sleep, 1
        }
        GetKeyState, state, F2
        if state = U
            break
    }
    return
}

如果可能的话,我正试着将它压缩成这样的东西:

hotkeys := [5, 2, F2]
hotkeyCount := hotkeys.MaxIndex()
curKey := 1

Loop, hotkeyCount
{
    hotkeyIndex := hotkeys[curKey]
    $%hotkeyIndex%::
    {
        Loop
        {
            Loop, 5
            {
                Send, {%hotkeyIndex%}
                Sleep, 1
            }
            GetKeyState, state, %hotkeyIndex%
            if state = U
                break
        }
        return
    }
    curKey := curKey + 1
}

1 个答案:

答案 0 :(得分:1)

创建一个FIFO堆栈,用于保护预设操作并在准备好后调用它们。

数组functions包含由各自的热键Function_aFunction_b触发的函数:Function_cabc。 热键不直接调用函数,但将其数字索引添加到堆栈stack

计时器checkstack检索数字索引,然后调用该索引处的数组functions中的函数。当函数返回时,如果有,则检索下一个索引。一次只运行一个函数。

SetBatchLines, -1

global stack := Object()
global stack_head = 0
global stack_tail = 0
global functions := [Func("Function_a"),Func("Function_b"),Func("Function_c")]

SetTimer, check , 25

return

check:
    if( stack_head > stack_tail )
    {
        i := stack[stack_tail]
        functions[i]()
        stack_tail++
    }
return  

Function_a()
{
    tooltip, Function_a running...
    Sleep, 1000
    tooltip, 
    return
}

Function_b()
{
    tooltip, Function_b running...
    Sleep, 1000
    tooltip,
    return
}

Function_c()
{
    tooltip, Function_c running...
    Sleep, 1000
    return
}

a::
    stack[stack_head] := 1
    stack_head++
return

s::
    stack[stack_head] := 2
    stack_head++
return

d::
    stack[stack_head] := 3
    stack_head++
return

这样可以同时运行函数,可以执行任何操作,同时热键可以向堆栈添加操作(函数索引),这些操作将按照一次添加一个的方式调用。 / p>

我已经编辑了你的例子以使其正常运行:

$a::
$s::
$d::
$1::

key := A_ThisHotkey
key :=Trim(key,"$")
Loop
{
    Loop, 5
    {
        SendInput, %key%
        Sleep, 1
    }
    state := GetKeyState(key , "P" )
    if state = 0
    {
        break
    }
}

return