在中频条件下进行上/下动作循环时出错

时间:2019-01-27 20:16:12

标签: autohotkey

我试图制作一个脚本,其中Gui控件一旦被选中,它将切换与之关联的特定键。

我成功地添加了IF Ab = 1,然后发送{a down},然后添加了else,以检查密钥的状态,使其在100ms后上升,从而可以循环。但是,不幸的是,我想做一个循环,然后再前进(这些键是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}睡眠600 {发送等。仅接收最后一个发送不起作用,对于延迟操作也是如此。

当前代码中允许向上或向下但不允许同时出现的这是我修改的代码:

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

将代码从状态名更改为简单状态会方便通信,而且Up和Down都是变量,并且不知道它们只能在getstate中使用U或D。因此,通过在初始按键之后立即添加它们并删除其他键来解决这些问题,从而对其进行了修改,因此现在可以来回移动了。谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码似乎有几个问题。 GetKeyState在输出变量中存储“ D”,“ U”或不存储任何内容,而不存储整个单词“ up”或“ down”。另一个问题与IF语句的语法有关。在您的情况下,您将需要使用以下内容:If keySstate = "D"

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

这不是错误,但是您可能需要考虑使用GetKeyState()函数。这样,您就可以将其与IF语句结合起来;像If GetKeyState( "s" )

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

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

相关问题