我曾尝试编写一个脚本,其中Gui控件一旦选中复选框就会切换与其关联的特定键。
我成功地添加了IF Ab =1 send {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
这将允许向上/向下,我还尝试发送{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
最初的代码是别人写的,我成功地修改了它,但是为了制作这个循环,我还试图创建一个辅助循环,也没有成功。
我想做的是在如果Mb =1的情况下
要让系统按下S 1000ms,然后按up,然后按w 1000ms,然后按up并循环,这样它就可以无限地来回移动。
EDIT : Answer found :感谢您的帮助。
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来修改它们解决了它,因此现在它来回移动。谢谢!
发布于 2019-01-29 19:26:51
看起来你的代码可能有几个问题。GetKeyState在output变量中存储"D“、"U”或不存储任何内容,而不是整个单词“up”或“down”。另一个问题与IF语句的语法有关。在您的例子中,您可能想要这样的代码:If keySstate = "D"
。
此外,您还提到希望保持1000ms;但是,您的代码设置为100ms。
这不是错误,但您可能需要考虑改用GetKeyState()函数。这样你就可以把它和IF语句结合起来,比如If GetKeyState( "s" )
。
https://www.autohotkey.com/docs/commands/GetKeyState.htm
请使用提到的更正更新您的代码,如果仍然有问题,我们可以从那里开始。
https://stackoverflow.com/questions/54392455
复制