我正在编写一个小函数,让用户为窗口设置一个值。
默认情况下,该窗口允许您在 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 智能地递增/递减以达到预定的数学总和?
我对此绞尽脑汁,任何输入都会很棒。
为了让它工作,我们可以创建一个“向上或向下发送”函数,它接受一个整数
i
:
i
为正时,会向下发送i
次;i
为负数时,会向上发送-i
次;i
为 0 时,它不会执行任何操作。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)
}