首页 > 解决方案 > 在 IF 条件下进行向上/向下动作循环时出错

问题描述

我试图制作一个脚本,一旦选中复选框,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 也是变量,它们不知道只有 U 或 D 可以在 getstate 中使用。因此,通过在初始击键后立即添加它们并删除 else 来修改它们来解决它,因此现在它来回移动。谢谢!

标签: autohotkey

解决方案


看起来您的代码可能存在一些问题。GetKeyState 在输出变量中存储“D”、“U”或任何内容,而不是整个单词“up”或“down”。另一个问题与 IF 语句的语法有关。在你的情况下,你会想要这样的东西:If keySstate = "D".

另外,您提到要保持 1000 毫秒;但是,您的代码设置为 100 毫秒。

这不是错误,但您可能需要考虑改用 GetKeyState() 函数。这样你就可以将它与你的 IF 语句结合起来;类似的东西,If GetKeyState( "s" )

https://www.autohotkey.com/docs/commands/GetKeyState.htm

请使用上述更正更新您的代码,如果仍有问题,我们可以从那里开始。


推荐阅读