Logitech/LGHUB Lua - 带中断的循环
Logitech/LGHUB Lua - Loop with break
我最近在为我的 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
脚本正在 运行ning LGHUB 宏,而我想在 运行ning 时将鼠标移动附加到该宏。没有检查宏当前是否 运行 的功能,只是循环并停止 lua 端。
所以我在 Lua 到 'run a loop independent' 中寻找一种可能性,它不会停止我脚本其余部分的执行(检查状态变量 [isMacroRunning] 是否已更改)。如果我在宏 运行ning 时按下另一个按钮,我也想破坏该宏。
但是如果我循环鼠标移动,我无法触发另一个 onEvent 函数,因为脚本指针(?)仍然卡在我的循环中。我目前的想法是用协程打破它,但我不确定如何在没有键输入发生时继续。
脚本在遇到 'PlayMacro()' 时不会停止等待,而且这个 API- 函数没有 return 值,只是将 lua 动作附加到 PlayMacro-函数。
也有可能转移 LGHUB 宏(本质上它只是按下按钮 A 并左键单击 40 秒然后释放按钮)但这并不能解决问题(至少我无法在其中找到解决方案)函数被困在循环中,无法打破它。
例如,如果 MouseButton11 触发一个循环并且我按下 MouseButton10,则 $arg 变量不会更改为 10 而是保持在 11,因为脚本指针(?)仍在循环中而不是触发 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)
´´´
步骤 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 已按下,然后循环退出。
我最近在为我的 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
脚本正在 运行ning LGHUB 宏,而我想在 运行ning 时将鼠标移动附加到该宏。没有检查宏当前是否 运行 的功能,只是循环并停止 lua 端。 所以我在 Lua 到 'run a loop independent' 中寻找一种可能性,它不会停止我脚本其余部分的执行(检查状态变量 [isMacroRunning] 是否已更改)。如果我在宏 运行ning 时按下另一个按钮,我也想破坏该宏。 但是如果我循环鼠标移动,我无法触发另一个 onEvent 函数,因为脚本指针(?)仍然卡在我的循环中。我目前的想法是用协程打破它,但我不确定如何在没有键输入发生时继续。
脚本在遇到 'PlayMacro()' 时不会停止等待,而且这个 API- 函数没有 return 值,只是将 lua 动作附加到 PlayMacro-函数。
也有可能转移 LGHUB 宏(本质上它只是按下按钮 A 并左键单击 40 秒然后释放按钮)但这并不能解决问题(至少我无法在其中找到解决方案)函数被困在循环中,无法打破它。 例如,如果 MouseButton11 触发一个循环并且我按下 MouseButton10,则 $arg 变量不会更改为 10 而是保持在 11,因为脚本指针(?)仍在循环中而不是触发 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)
´´´
步骤 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 已按下,然后循环退出。