如何将当前值相对增加/减少到用户选择的值?

问题描述 投票:0回答:1

我正在编写一个小函数,让用户为窗口设置一个值。

默认情况下,该窗口允许您在 5 个可能的值之间向前/向后循环:

  • Red
  • Green
  • Blue
  • Black
  • White

窗口不允许您通过绝对方式设置其值。例如,您不能只将其设置为

Blue
,您必须向后或向前循环,直到到达
Blue
。没有鼠标交互方式,只有:

  • Up
    键向前循环
  • Down
    键向后循环 这些值会环绕,因此当您到达
    White
    时,它会返回到
    Red
    ,反之亦然。

我想用 AHK 解决这个问题,通过将 5 个值中的每一个与一个数字相关联。

  • 1
    =
    Red
  • 2
    =
    Green
  • 3
    =
    Blue
  • 4
    =
    Black
  • 5
    =
    White

SetState(Value := ""){
    Value := Value = "Red"      ? "1"
            :   Value = "Green" ? "2"
            :   Value = "Blue"      ? "3"
            :   Value = "Black" ? "4"
            :   "5"

    StateIs := GetState()  ;Retrieves the current state, a value such as "2" for when its "Green"

    NewState    :=  StateIs (-|+) = Value          ; This is pseudo  code
    If Incrementing or "+"                      ; This is pseudo  code
        SendInput,% "{Up " NewState "}"
    If Decrementing or "-"                      ; This is pseudo  code
        SendInput,% "{Down " NewState "}"     
    }

因此,像

Space::SetState("Green")
这样的东西会通过发送所需的第 N 个
Green
/
Up
键,立即将其设置为
Down

我被困住的部分是

NewState := StateIs (-|+) = Value
。我不太明白,如何让 AHK 智能地递增/递减以达到预定的数学总和?

我对此绞尽脑汁,任何输入都会很棒。

autohotkey
1个回答
0
投票

为了让它工作,我们可以创建一个“向上或向下发送”函数,它接受一个整数

i

  • i
    为正时,会向下发送
    i
    次;
  • i
    为负数时,会向上发送
    -i
    次;
  • i
    为 0 时,它不会执行任何操作。

在 AHKv2 中:

SendUpOrDown(times){
    if(times != 0){ 
        Send "{" ((times > 0) ? "Down " : "Up ") ((times > 0) ? times : -times) "}"
    }
}

示例

#Requires AutoHotkey v2.0

;for testing
F9::{
    SetState("Black")
}

;for testing
GetState(){    
    return "Red"
}

SetState(stateString){
    static stateStrToInt := Map(
        "Red", 1,
        "Green", 2,
        "Blue", 3,
        "Black", 4,
        "White", 5,
    )
    static SendUpOrDown(times){
        if(times != 0){ 
            Send "{" ((times > 0) ? "Down " : "Up ") ((times > 0) ? times : -times) "}"
        }
    }

    i := stateStrToInt[stateString]
    j := stateStrToInt[GetState()]
    SendUpOrDown(i - j)
}
© www.soinside.com 2019 - 2024. All rights reserved.