Logitech G Hub Lua脚本:G1键循环切换功能实现遇阻求助
问题分析与解决方案
你的代码无法中断循环的核心原因是:当OnEvent函数进入while循环后,会阻塞整个脚本的事件处理线程——Logitech的Lua脚本是单线程执行的,OnEvent不执行完毕,就无法响应新的G1按键事件,所以你第二次按G1的操作,要等到循环因safety计数到5结束后,才会被处理。
修改后的代码
local msMakro = false local safety = 0 function OnEvent(event, arg) OutputLogMessage("Event: "..event.." Arg: "..arg.."\n") -- 处理G1按键触发 if event == "G_PRESSED" and arg == 1 then OutputLogMessage("\nG1 Pressed \n") msMakro = not msMakro OutputLogMessage("msMakro = "..tostring(msMakro).."\n") -- 启动循环时重置safety计数 if msMakro then safety = 0 end end -- 循环逻辑:每次迭代都检查msMakro状态,同时处理新事件 while msMakro and safety < 5 do PressAndReleaseKey("a") Sleep(math.random(1000, 1500)) safety = safety + 1 OutputLogMessage("safety = "..safety.."\n") -- 关键:处理队列中的事件,让新的G1按键能触发状态反转 ProcessEvents() end end
关键修改说明
- 加入
ProcessEvents():在循环内部调用这个函数,会让脚本暂时跳出循环,处理队列中等待的事件(比如你第二次按G1的操作),这样msMakro的值会被及时反转,循环条件不满足时就会终止。 - 重置
safety:每次启动循环(msMakro变为true时)重置计数,避免第二次触发循环时,safety已经是5导致循环直接不执行。 - 简化日志输出:把多个
OutputLogMessage合并成一行,让日志更整洁。
内容的提问来源于stack exchange,提问作者Noddy
相关产品推荐
相关产品推荐

