在 IF 条件下进行向上/向下动作循环时出错
Error making a up / down action loop under IF condition
我试图制作一个脚本,其中 Gui 控制器一旦选中复选框,它就会切换与其关联的特定键。
我成功地添加了 IF Ab = 1 send {a down} 然后添加了一个 else 以查看密钥的状态,使其在 100 毫秒后上升,以便它可以循环。但是我想做一个向前然后向后的循环(这些键是向前的 W 和向后的 S)不幸的是我没有成功。
无需添加所有代码...以下是重要的部分。
TTshowing = 0
Gui, -Caption +LastFound +AlwaysOnTop
Gui, Add, Checkbox, gRefocus cWhite, Y
Gui, Add, Checkbox, gRefocus cWhite, S
Gui, Add, Checkbox, gRefocus cWhite, U
Gui, Add, Checkbox, gRefocus cWhite, I
Gui, Add, Checkbox, gRefocus cWhite, O
Gui, Add, Checkbox, gRefocus cWhite, M
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Sb, , Button2
GuiControlGet, Ub, , Button3
GuiControlGet, Ib, , Button4
GuiControlGet, Ob, , Button5
GuiControlGet, Mb, , Button6
if Yb = 1
Send y
if Sb = 1
Send {s down}
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Mb = 1
GetKeyState, keyWstate, W
if %keyWstate% = up
Send {w down}
Sleep 600
GetKeyState, keyWstate, W
if %keyWstate% = down
Send {w up}
Sleep 100
GetKeyState, keySstate, S
if %keySstate% = up
Send {s down}
Sleep 650
GetKeyState, keySstate, S
if %keySstate% = down
Send {s up}
Sleep 100}
}
Return
这将允许向上/向下,我也尝试让 Send{w down} Sleep 600 { send 等.. 不起作用只需要最后一次发送,延迟操作等也是如此
当前代码允许向上或向下但不能同时允许两者是我修改的代码:
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Sb, , Button2
GuiControlGet, Ub, , Button3
GuiControlGet, Ib, , Button4
GuiControlGet, Ob, , Button5
GuiControlGet, Mb, , Button6
if Yb = 1
Send y
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Sb = 1
Send {S down}
if Mb = 1
Send {W down}
else
GetKeyState, keySstate, S
if %keySstate% = down
Send {s up}
Sleep 100
GetKeyState, keyWstate, W
if %keyWstate% = down
Send {w up}
Sleep 100
}
Return
原代码是别人写的,我修改成功了,但是为了做这个循环,我也尝试创建一个二次循环,也没成功。
我想做的是在 If Mb = 1
让系统按下 S 1000 毫秒,然后按下,然后按下 w 1000 毫秒,然后按下并循环,这样它就可以无限地来回。
编辑 ::: 找到答案 ::: 感谢您的帮助。
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Ub, , Button2
GuiControlGet, Ib, , Button3
GuiControlGet, Ob, , Button4
GuiControlGet, Sb, , Button5
GuiControlGet, Wb, , Button6
GuiControlGet, Tb, , Button7
if Yb = 1
Send y
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Tb = 1
Send {TAB}
if Sb = 1
Send {S down}
Sleep 500
GetKeyState, state, S
if state = D
Send {S up}
Sleep 50
if Wb = 1
Send {W down}
Sleep 500
GetKeyState, state, W
if state = "D"
Send {W up}
Sleep 50
}
Return
把代码从statename改成state方便交流,Up和down也是变量,不知道getstate只能用U或D。因此,通过在初始击键之后立即添加它们并删除 else 来修改它们来解决它,因此现在它来回移动。谢谢!
您的代码似乎有几个问题。 GetKeyState 在输出变量中存储 "D"、"U" 或不存储任何内容,而不是整个单词 'up' 或 'down'。另一个问题与 IF 语句的语法有关。在你的情况下,你会想要这样的东西:If keySstate = "D"
.
另外,您提到要保持 1000 毫秒;但是,您的代码设置为 100 毫秒。
这不是错误,但您可能需要考虑改用 GetKeyState() 函数。这样你就可以将它与你的 IF 语句结合起来;类似 If GetKeyState( "s" )
.
https://www.autohotkey.com/docs/commands/GetKeyState.htm
请使用上述更正更新您的代码,如果仍有问题,我们可以从那里开始。
我试图制作一个脚本,其中 Gui 控制器一旦选中复选框,它就会切换与其关联的特定键。
我成功地添加了 IF Ab = 1 send {a down} 然后添加了一个 else 以查看密钥的状态,使其在 100 毫秒后上升,以便它可以循环。但是我想做一个向前然后向后的循环(这些键是向前的 W 和向后的 S)不幸的是我没有成功。
无需添加所有代码...以下是重要的部分。
TTshowing = 0
Gui, -Caption +LastFound +AlwaysOnTop
Gui, Add, Checkbox, gRefocus cWhite, Y
Gui, Add, Checkbox, gRefocus cWhite, S
Gui, Add, Checkbox, gRefocus cWhite, U
Gui, Add, Checkbox, gRefocus cWhite, I
Gui, Add, Checkbox, gRefocus cWhite, O
Gui, Add, Checkbox, gRefocus cWhite, M
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Sb, , Button2
GuiControlGet, Ub, , Button3
GuiControlGet, Ib, , Button4
GuiControlGet, Ob, , Button5
GuiControlGet, Mb, , Button6
if Yb = 1
Send y
if Sb = 1
Send {s down}
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Mb = 1
GetKeyState, keyWstate, W
if %keyWstate% = up
Send {w down}
Sleep 600
GetKeyState, keyWstate, W
if %keyWstate% = down
Send {w up}
Sleep 100
GetKeyState, keySstate, S
if %keySstate% = up
Send {s down}
Sleep 650
GetKeyState, keySstate, S
if %keySstate% = down
Send {s up}
Sleep 100}
}
Return
这将允许向上/向下,我也尝试让 Send{w down} Sleep 600 { send 等.. 不起作用只需要最后一次发送,延迟操作等也是如此
当前代码允许向上或向下但不能同时允许两者是我修改的代码:
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Sb, , Button2
GuiControlGet, Ub, , Button3
GuiControlGet, Ib, , Button4
GuiControlGet, Ob, , Button5
GuiControlGet, Mb, , Button6
if Yb = 1
Send y
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Sb = 1
Send {S down}
if Mb = 1
Send {W down}
else
GetKeyState, keySstate, S
if %keySstate% = down
Send {s up}
Sleep 100
GetKeyState, keyWstate, W
if %keyWstate% = down
Send {w up}
Sleep 100
}
Return
原代码是别人写的,我修改成功了,但是为了做这个循环,我也尝试创建一个二次循环,也没成功。
我想做的是在 If Mb = 1
让系统按下 S 1000 毫秒,然后按下,然后按下 w 1000 毫秒,然后按下并循环,这样它就可以无限地来回。
编辑 ::: 找到答案 ::: 感谢您的帮助。
Loop
{
GuiControlGet, Yb, , Button1
GuiControlGet, Ub, , Button2
GuiControlGet, Ib, , Button3
GuiControlGet, Ob, , Button4
GuiControlGet, Sb, , Button5
GuiControlGet, Wb, , Button6
GuiControlGet, Tb, , Button7
if Yb = 1
Send y
if Ub = 1
Send u
if Ib = 1
Send I
if Ob = 1
Send O
if Tb = 1
Send {TAB}
if Sb = 1
Send {S down}
Sleep 500
GetKeyState, state, S
if state = D
Send {S up}
Sleep 50
if Wb = 1
Send {W down}
Sleep 500
GetKeyState, state, W
if state = "D"
Send {W up}
Sleep 50
}
Return
把代码从statename改成state方便交流,Up和down也是变量,不知道getstate只能用U或D。因此,通过在初始击键之后立即添加它们并删除 else 来修改它们来解决它,因此现在它来回移动。谢谢!
您的代码似乎有几个问题。 GetKeyState 在输出变量中存储 "D"、"U" 或不存储任何内容,而不是整个单词 'up' 或 'down'。另一个问题与 IF 语句的语法有关。在你的情况下,你会想要这样的东西:If keySstate = "D"
.
另外,您提到要保持 1000 毫秒;但是,您的代码设置为 100 毫秒。
这不是错误,但您可能需要考虑改用 GetKeyState() 函数。这样你就可以将它与你的 IF 语句结合起来;类似 If GetKeyState( "s" )
.
https://www.autohotkey.com/docs/commands/GetKeyState.htm
请使用上述更正更新您的代码,如果仍有问题,我们可以从那里开始。