【罗技新版驱动鼠标宏编程】从入门到精通
春风得力总繁华
2024年11月08日 14:11

前置结论:

1.逻辑鼠标左键在使用LUA脚本时注意要激活,激活代码:EnablePrimaryMouseButtonEvents(true)

2.在 OnEvent 函数中直接进行repeat 循环可能导致阻塞

实测方法:按下鼠标4号键(侧键),然后按住鼠标左键不松下压

两段代码效果图:

第一段:(可以看到,下压正常且稳定

第二段:(可以看见点状和竖线交错,点状就是出现bug,没有下压,左边那个斜线是我鼠标晃动了,请忽视。出现这种情况就是上面结论2说的,在OnEvent 函数中使用循环导致的阻塞问题,大家可能也会碰到

具体信息见与AI对话:

我问:

第一段代码:

实测效果:正常稳定运行

lock =false

function OnEvent(event, arg)

EnablePrimaryMouseButtonEvents(true)

--OutputLogMessage("event=%s arg=%d\n",event,arg)

--OutputLogMessage(arg)

if (event == "MOUSE_BUTTON_PRESSED" and arg == 4) then

notLock()

if lock then

OutputLogMessage("kai\n")

else

OutputLogMessage("guan\n")

end

end

if (event == "MOUSE_BUTTON_PRESSED" and arg == 1 and lock) then

start()

end

end

function notLock()

lock = not lock

end

function start()

repeat

MoveMouseRelative(0,10)

Sleep(9)

until not IsMouseButtonPressed(1)

end

第二段代码:

实测效果:能实现功能,但不稳定,主要表现为在kai状态下,点击鼠标左键偶尔无效果

EnablePrimaryMouseButtonEvents(true)

kaiguan = false

function OnEvent(event, arg)

--OutputLogMessage("Event: "..event.." Arg: "..arg.."")

if (event == "MOUSE_BUTTON_PRESSED" and arg == 4) then

-- Mouse Button 6 has been pressed

kaiguan = not kaiguan

if kaiguan then

OutputLogMessage("kai\n")

else

OutputLogMessage("guan\n")

end

end

if kaiguan then

if IsMouseButtonPressed(1) then

repeat

Sleep(10)

MoveMouseRelative(0,5)

OutputLogMessage("Left mouse button is pressed.\n")

until not IsMouseButtonPressed(1)

end

end

end

以上是两段实现同一功能的代码对比,帮我分析下:

1.两段代码哪个更好

2.第二段代码为什么会出现失效情况,而第一段不会

智普清言回答:

分析两段代码:

第一段代码:

优点:

  • 使用了一个 lock 变量来控制鼠标左键按下事件的响应,逻辑清晰。

  • 在鼠标左键按下事件发生时,通过 lock 变量判断是否执行 start 函数。

  • 使用 repeat 循环和 IsMouseButtonPressed(1) 来确保在鼠标左键释放之前持续移动鼠标。

第二段代码:

优点:

  • 使用了 kaiguan 变量来切换状态,逻辑上与第一段代码相似。

  • 在 kaiguan 为 true 时,检查鼠标左键是否被按下,并执行循环。

比较:

  1. 哪个更好:

    • 第一段代码在结构上更加清晰,逻辑上更加直接。它避免了在 OnEvent 函数中直接进行循环操作,这有助于防止潜在的阻塞问题。

    • 第二段代码在 OnEvent 函数中直接进行了循环操作,这可能会导致脚本在执行循环时无法及时响应其他事件。

  1. 第二段代码为什么会出现失效情况:

    • 事件处理延迟:第二段代码在 OnEvent 函数中直接进行了 repeat 循环,这可能会阻塞事件处理循环,导致脚本无法及时响应后续的鼠标事件。

    • 脚本引擎限制:某些脚本引擎可能不支持在事件处理函数中进行长时间的操作,如无限循环或长时间睡眠。

    • 鼠标状态检测:IsMouseButtonPressed(1) 在循环中可能会因为各种原因(如脚本引擎的内部状态更新延迟)无法正确检测到鼠标左键的释放状态。

    • 资源竞争:脚本可能在尝试移动鼠标时与其他应用程序或系统进程发生资源竞争,导致操作失败。

结论:

  • 第一段代码更好,因为它在结构上更加清晰,并且避免了在事件处理函数中进行长时间的操作。

  • 第二段代码的失效情况可能是由于在 OnEvent 函数中直接进行循环操作,这可能导致事件处理阻塞或延迟。

为了解决第二段代码的问题,可以考虑以下修改:

  • 移除 OnEvent 函数中的 repeat 循环,改为设置一个标志变量,然后在脚本的主体循环中检查这个标志变量来执行操作。

  • 确保脚本引擎能够及时处理事件,并且不会因为长时间的操作而阻塞。