autohotkey - 在 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 来修改它们来解决它,因此现在它来回移动。谢谢!
解决方案
看起来您的代码可能存在一些问题。GetKeyState 在输出变量中存储“D”、“U”或任何内容,而不是整个单词“up”或“down”。另一个问题与 IF 语句的语法有关。在你的情况下,你会想要这样的东西:If keySstate = "D"
.
另外,您提到要保持 1000 毫秒;但是,您的代码设置为 100 毫秒。
这不是错误,但您可能需要考虑改用 GetKeyState() 函数。这样你就可以将它与你的 IF 语句结合起来;类似的东西,If GetKeyState( "s" )
。
https://www.autohotkey.com/docs/commands/GetKeyState.htm
请使用上述更正更新您的代码,如果仍有问题,我们可以从那里开始。
推荐阅读
- angular - 如何隐藏位置更改,但在 url 中以角度 9 显示参数
- python - 类的“Python NameError:未定义名称”
- docker - 如何将 docker 进程结果导出到本地文件 - 同时通过 ssh 连接到主机?
- pandas - PANDAS:在 value_counts() 中传递 normalize=True 只返回零
- php - 使用必填字段验证非必填关联数组
- google-cloud-platform - 如何将 GCP Cloud Monitoring (Stackdriver) 警报政策周期设置为大于 24 小时?
- c# - Razor 页面 - 在 dotnet core 5 中创建用户配置文件并从 Azure AD 声明中检索数据
- c++ - 在 c++ 98 和 berkeley 套接字中读取和存储 UDP 数据报流
- dialogflow-es - 如何使用 .net api fullfillment 将 Order Transaction api v2 迁移到 v3?
- javascript - 向 GTM 自定义 javascript 变量数组添加过滤器