【问题标题】:How do I condense multiple similar hotkeys into one in AutoHotkey?如何在 AutoHotkey 中将多个相似的热键压缩为一个?
【发布时间】:2016-03-15 17:25:50
【问题描述】:

我正在尝试创建热键来模拟我正在玩的在线游戏中的输入缓冲,该游戏本身不支持输入缓冲,这意味着混合一个拼写键,以便在上一个拼写完成施法后它会消失是手动操作的最佳方法。

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

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

到目前为止,我的代码的示例 sn-p 只考虑了 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
}

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    创建一个 FIFO 堆栈来保护预设动作并在它们准备好时调用它们。

    数组functions 包含以下函数:Function_aFunction_bFunction_c,它们由各自的热键触发,abc。 热键不直接调用函数,而是将它们的数字索引添加到堆栈stack

    计时器check,从stack 检索数字索引,然后调用数组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
    

    这使得函数可以并发运行,可以做任何你想做的事情,同时热键可以将动作(函数索引)添加到堆栈中,这将按一次添加的顺序调用。


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

    $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
    

    【讨论】:

    • 有没有办法做到这一点,而无需为每个键绑定创建单独的行?除非我遗漏了一些东西,否则这似乎根本没有被压缩......我不介意键不能一起按住,我介意制作 16 个不同的热键,而不是仅仅将一个字母输入到一个数组中将该键添加到我的脚本中
    • @Erin 您必须编写热键,否则您将如何获得不同的操作?您在示例中执行此操作,其中定义了 3 个热键和它们执行的一些操作。考虑到它们的大小,我的示例实际上更紧凑。
    • 我编辑了我的帖子,也许我的例子比我试图解释我试图用语言实现的目标更清楚
    • @Erin 查看更新。我不确定这是否是您要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 2021-12-18
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2018-03-25
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多