问题描述
我最近在为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函数也没有返回值,只能将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 - goto游戏选项;将动作绑定到
F12
而不是MB#4
现在,当您按下物理MB#4时,游戏将看到F12并执行您的旧动作。
第2步。
转到GHUB(SYSTEM选项卡);将“返回”绑定到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,并退出了循环。