罗技/LGHUB Lua - 带中断的循环
Posted
技术标签:
【中文标题】罗技/LGHUB Lua - 带中断的循环【英文标题】:Logitech/LGHUB Lua - Loop with break 【发布时间】:2021-02-04 13:02:11 【问题描述】:我最近在为我的 LG 鼠标制作宏脚本时拿起了 Lua。 不幸的是,Lua-API 确实受到调试、io 和文件不工作的限制(来源:http://www.softpanorama.org/Hardware/Peripherals/Keyboards/Logitech_G_keyboard_macros/lua_scripting.shtml#Limitations) 这里也是官方参考:https://douile.github.io/logitech-toggle-keys/APIDocs.pdf
脚本正在运行 LGHUB 宏,而我想在该宏运行时将鼠标移动附加到该宏。没有用于检查宏当前是否正在运行以循环和停止 lua 端的功能。 所以我在 Lua 中寻找一种“独立运行循环”的可能性,它不会停止执行我的脚本的其余部分(检查状态变量 [isMacroRunning] 是否已更改)。如果我在宏运行时按下另一个按钮,我也想打破那个宏。 但是如果我循环鼠标移动,我无法触发另一个 onEvent 函数,因为脚本指针(?)仍然卡在我的循环中。我目前的想法是用协程打破它,但我不确定在没有按键输入的情况下如何继续。
如果遇到“PlayMacro()”,脚本不会停止并等待,而且此 API-Function 没有返回值,只是将 lua 操作附加到 PlayMacro-function。
还有可能转移 LGHUB 宏(基本上它只是按下按钮 A 并左键单击 40 秒然后释放按钮)但这并不能解决问题(至少我无法在其中找到解决方案)与功能被困在循环中,无法打破它。 例如,如果 MouseButton11 触发循环并且我按下 MouseButton10,$arg 变量不会更改为 10,而是保持在 11,因为 script-pointer(?) 仍在循环中,而不是触发 onEvent 函数。
脚本似乎在加载时执行一次(例如切换鼠标配置文件),然后 onEvent 函数会监听。如果我能以某种方式在 [isMacroRunning] 上运行循环检查,同时仍然能够触发 onEvent 函数,我可以完成这项工作。但除此之外,我对 Lua 及其行为知之甚少。
Edit1:添加了仅描述所需核心功能的“基本脚本”。这不起作用,因为在第一个 onEvent 完成之前无法触发第二个 onEvent。但是第一个 onEvent 旨在打破变量变化。变量更改在第二个 onEvent 中触发。需要的解决方案:某种解决方法或使用其他 Lua 函数将第一个 onEvent 执行与第二个 onEvent 分开。
基本脚本:
```
isMacroRunning = false
function wiggle()
PressKey("a")
while true do
if not isMacroRunning then break end
OutputLogMessage("wiggle\n")
MoveMouseRelative (5, 0)
Sleep(150)
MoveMouseRelative (-5, 0)
Sleep(150)
end
end
function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
isMacroRunning = true
wiggle()
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
isMacroRunning = false
ReleaseKey("a")
end
end
´´´
完整脚本:
local isMacroRunning = false
coco = coroutine.create(function()
while true do
if not isMacroRunning then break end
MoveMouseRelative (5, 0)
Sleep(150)
MoveMouseRelative (-5, 0)
Sleep(150)
coroutine.yield()
end
end)
function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
isMacroRunning = true
runMacro()
elseif(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
isMacroRunning = false
runMacro()
end
end
function runMacro()
if isMacroRunning then
PlayMacro('farm')
coroutine.resume(coco)
OutputLogMessage("Start Macro\n")
else
AbortMacro()
OutputLogMessage("Aborted\n")
end
end
coroutine.resume(coco)
´´´
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:第 1 步。 确保您没有在游戏中使用 MB#4(“向后”)。 如果在游戏中为 MB#4 分配了某些操作,请执行以下操作:
选择您当前未在游戏中使用的键盘按钮(例如,F12
)
转到 GHUB(键选项卡);将 F12
绑定到您的物理 MB#4
转到游戏选项;将操作绑定到 F12
而不是 MB#4
现在,当您按下物理 MB#4 时,游戏会看到 F12 并执行您的旧操作。
第 2 步。 转到 GHUB(系统选项卡);将“返回”绑定到 MB#10
第 3 步。 脚本。
function OnEvent(event, arg)
if event == "MOUSE_BUTTON_PRESSED" and arg == 11 then
PressMouseButton(1) -- down LMB
PressKey("A") -- down "A"
repeat
MoveMouseRelative(5,0)
Sleep(150)
MoveMouseRelative(-5,0)
Sleep(150)
until IsMouseButtonPressed(4) -- btn#4 is bound to btn#10
ReleaseKey("A") -- up "A"
ReleaseMouseButton(1) -- up LMB
end
end
它是如何工作的: 当您按下 MB#11 时,循环开始。 当您稍后按下 MB#10 时,IsMouseButtonPressed() 会看到按钮#4 被按下,然后循环退出。
【讨论】:
yeeeees 这行得通,非常感谢!!!啊,我明白了,所以重复操作允许在检查其他输入之间进行,这就是我正在寻找的。再次感谢您!以上是关于罗技/LGHUB Lua - 带中断的循环的主要内容,如果未能解决你的问题,请参考以下文章