罗技/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 - 带中断的循环的主要内容,如果未能解决你的问题,请参考以下文章

罗技 LUA 脚本添加睡眠定时器

GPRS(Air202) Lua开发: GPIO中断

GPRS(Air202) Lua开发: GPIO中断

Lua 中断之后怎么从中断的位置继续执行

Java为什么允许在任意语句上使用带标签的中断?

51单片机c语言中断函数不能进行参数传递,是啥意思,谁能解释一下