Logitech / LGHUB Lua-中断循环

问题描述

我最近在为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,并退出了循环。