You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logitech G-Hub Lua脚本能否监听多事件?实现G4释放即终止执行

Logitech G-Hub Lua脚本:G4释放时终止执行流程

我有一个可在Logitech G-Hub上运行的Lua脚本,当前逻辑是G4按键按下时执行一系列操作,代码如下:

function OnEvent(event, arg)
    if (event == "G_PRESSED" and arg == 4) then
        PressKey("s")
        Sleep(200)
        PressKey("lctrl")
        Sleep(300)
        -- 更多后续操作
    end 
end

我需要实现G4按键被释放时立即终止整个脚本的执行流程,曾尝试在每个步骤后判断事件,但这种写法无法生效:

function OnEvent(event, arg)
    if (event == "G_PRESSED" and arg == 4) then
        PressKey("s")
        if (event == "G_RELEASED" and arg == 4) then
            return
        end
        Sleep(200)
        if (event == "G_RELEASED" and arg == 4) then
            return
        end
        PressKey("lctrl")
        if (event == "G_RELEASED" and arg == 4) then
            return
        end
        Sleep(300)
        if (event == "G_RELEASED" and arg == 4) then
            return
        end
    end
end

请问如何实现G4释放时立即终止后续命令执行?


可以实现,核心思路是用全局变量标记G4的释放状态,并在执行流程的每个环节(包括等待过程中)检查这个状态,一旦检测到释放就终止流程。

具体实现步骤:

  • 定义全局变量记录G4是否被释放
  • 在OnEvent中处理G_RELEASED事件,更新全局变量
  • 自定义一个带释放检查的休眠函数,替代原生Sleep,避免长时间休眠无法响应释放事件
  • 在执行流程的每一步操作后,检查全局变量,若已释放则终止并清理按键状态

完整代码示例:

-- 全局变量:标记G4是否被释放
local g4_released = false

function OnEvent(event, arg)
    -- 处理G4释放事件,更新标记并清理按键
    if event == "G_RELEASED" and arg == 4 then
        g4_released = true
        ReleaseKey("s")
        ReleaseKey("lctrl")
        return
    end

    -- 处理G4按下事件
    if event == "G_PRESSED" and arg == 4 then
        -- 重置释放标记
        g4_released = false

        -- 执行第一步操作
        PressKey("s")
        if g4_released then return end
        SafeSleep(200)
        if g4_released then return end

        -- 执行第二步操作
        PressKey("lctrl")
        if g4_released then return end
        SafeSleep(300)
        if g4_released then return end

        -- 后续更多操作,重复上述检查逻辑
        -- ...

        -- 所有操作完成后释放按键
        ReleaseKey("s")
        ReleaseKey("lctrl")
    end
end

-- 自定义休眠函数:每隔10ms检查一次G4释放状态
function SafeSleep(duration)
    local start_time = GetRunningTime()
    while GetRunningTime() - start_time < duration do
        if g4_released then
            return
        end
        Sleep(10)
    end
end

关键说明:

  • 全局变量g4_released在G4按下时重置为false,释放时设为true
  • SafeSleep函数通过短间隔休眠+状态检查,确保在等待过程中能及时响应G4释放事件
  • 每一步操作后都检查g4_released,一旦为true立即终止流程,同时在G_RELEASED事件中主动清理按住的按键,避免按键卡住

内容的提问来源于stack exchange,提问作者John Lexus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:15:38