最近,我在为我的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宏,而我希望在该宏运行时将鼠标移动附加到该宏。没有检查宏当前是否运行到just循环并停止lua端的功能。因此,我在Lua中寻找一种“独立运行循环”的可能性,它不会停止执行我的其余脚本(检查状态变量isMacroRunning是否已经更改)。如果在宏运行时按下另一个按钮,我还想破坏该宏。但是如果我循环鼠标移动,我就不能触发另一个onEvent函数,因为脚本指针(?)还困在我的圈子里。我目前的想法是用一个协同线来打破这一点,但我不知道如何继续,而没有关键的输入正在发生。
如果遇到'PlayMacro()',脚本不会停止和等待,这个API-函数也没有返回值,只需将lua操作附加到PlayMacro函数。
也有可能转移LGHUB宏(基本上是它的pressButton A和左击40度,然后释放按钮),但这并不能解决问题(至少我无法在其中找到解决方案),因为函数被卡在循环中,没有办法破坏它。例如,如果MouseButton11触发一个循环并按MouseButton10,则$arg变量不会更改为10,而是保持在11,因为脚本指针(?)仍在循环中,而不是触发onEvent函数。
脚本似乎在加载时执行一次(例如,切换鼠标配置文件),然后onEvent函数侦听。如果我能够在isMacroRunning上运行循环检查,同时仍然能够触发onEvent-函数,我就可以让它工作起来。但除此之外,我对Lua及其行为知之甚少。
Edit1:添加了“基本脚本”,它只描述所需的核心函数。这是不工作的,因为第二个onEvent不能触发,直到第一个onEvent已经完成。但是,第一个onEvent的设计是为了打破一个可变的变化。变量变化是在第二个onEvent中触发的。所需的解决方案:某种解决办法或使用其他Lua函数将第一次onEvent执行与第二次onEvent分离开来。
基本剧本:
isMacroRunning = false
函数摆动()
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
结束
函数OnEvent(事件,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
结束
“”
Full Script:
```javascript
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)
“”
发布于 2020-10-22 18:57:45
步骤1.
确保您没有在游戏中使用MB#4 (“向后”)。
如果在游戏中为MB#4分配了一些操作,请执行以下操作:
选择当前在游戏中不使用的键盘按钮(例如,F12
)
F12
绑定到物理MB#4
F12
而不是MB#4)
现在,当您按下物理MB#4时,游戏将看到F12并执行您的旧操作。
步骤2.
Goto (系统选项卡);将"Back“绑定到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()会看到button#4被按下,循环退出。
https://stackoverflow.com/questions/64466534
复制相似问题