首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Logitech/LGHUB Lua -环与断口

Logitech/LGHUB Lua -环与断口
EN

Stack Overflow用户
提问于 2020-10-21 15:08:16
回答 1查看 3.3K关注 0票数 0

最近,我在为我的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分离开来。

基本剧本:

代码语言:javascript
运行
复制

isMacroRunning = false

函数摆动()

代码语言:javascript
运行
复制
PressKey("a")
代码语言:javascript
运行
复制
while true do
代码语言:javascript
运行
复制
    if not isMacroRunning then break end
代码语言:javascript
运行
复制
    OutputLogMessage("wiggle\n")
代码语言:javascript
运行
复制
    MoveMouseRelative (5, 0)
代码语言:javascript
运行
复制
    Sleep(150)
代码语言:javascript
运行
复制
    MoveMouseRelative (-5, 0)
代码语言:javascript
运行
复制
    Sleep(150)
代码语言:javascript
运行
复制
end

结束

函数OnEvent(事件,arg)

代码语言:javascript
运行
复制
if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
代码语言:javascript
运行
复制
    isMacroRunning = true
代码语言:javascript
运行
复制
    wiggle()
代码语言:javascript
运行
复制
end
代码语言:javascript
运行
复制
if(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
代码语言:javascript
运行
复制
    isMacroRunning = false
代码语言:javascript
运行
复制
    ReleaseKey("a")
代码语言:javascript
运行
复制
end

结束

“”

代码语言:javascript
运行
复制
Full Script:

```javascript
代码语言:javascript
运行
复制
local isMacroRunning = false
代码语言:javascript
运行
复制
coco = coroutine.create(function()
代码语言:javascript
运行
复制
    while true do
代码语言:javascript
运行
复制
        if not isMacroRunning then break end
代码语言:javascript
运行
复制
        MoveMouseRelative (5, 0)
代码语言:javascript
运行
复制
        Sleep(150)
代码语言:javascript
运行
复制
        MoveMouseRelative (-5, 0)
代码语言:javascript
运行
复制
        Sleep(150)
代码语言:javascript
运行
复制
        coroutine.yield()
代码语言:javascript
运行
复制
    end
代码语言:javascript
运行
复制
end)
代码语言:javascript
运行
复制
function OnEvent(event, arg)
代码语言:javascript
运行
复制
    if (event == "MOUSE_BUTTON_PRESSED" and arg == 11) then
代码语言:javascript
运行
复制
        isMacroRunning = true
代码语言:javascript
运行
复制
        runMacro()
代码语言:javascript
运行
复制
    elseif(event == "MOUSE_BUTTON_PRESSED" and arg == 10 and isMacroRunning) then
代码语言:javascript
运行
复制
        isMacroRunning = false
代码语言:javascript
运行
复制
        runMacro()
代码语言:javascript
运行
复制
    end
代码语言:javascript
运行
复制
end
代码语言:javascript
运行
复制
function runMacro()
代码语言:javascript
运行
复制
    if isMacroRunning then
代码语言:javascript
运行
复制
        PlayMacro('farm')
代码语言:javascript
运行
复制
        coroutine.resume(coco)
代码语言:javascript
运行
复制
        OutputLogMessage("Start Macro\n")
代码语言:javascript
运行
复制
    else
代码语言:javascript
运行
复制
        AbortMacro()
代码语言:javascript
运行
复制
        OutputLogMessage("Aborted\n")
代码语言:javascript
运行
复制
    end
代码语言:javascript
运行
复制
end
代码语言:javascript
运行
复制
coroutine.resume(coco)

“”

代码语言:javascript
运行
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-22 18:57:45

步骤1.

确保您没有在游戏中使用MB#4 (“向后”)。

如果在游戏中为MB#4分配了一些操作,请执行以下操作:

选择当前在游戏中不使用的键盘按钮(例如,F12)

  • goto GHUB(键选项卡);将F12绑定到物理MB#4

  • goto游戏选项;将操作绑定到F12而不是MB#4

)

现在,当您按下物理MB#4时,游戏将看到F12并执行您的旧操作。

步骤2.

Goto (系统选项卡);将"Back“绑定到MB#10

步骤3.

剧本。

代码语言:javascript
运行
复制
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被按下,循环退出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64466534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档