Logitech游戏软件Lua脚本重复切换

我有一个脚本,它会执行左击,然后向右移动约1厘米,然后再次点击并向左移动。

我希望这个脚本能够连续重复执行,直到我按下一个键,除了MB 1、2和3之外,使用哪个键都无所谓。

我已经尝试了一段时间,通过重复和循环,我唯一实现的就是每运行一次,软件就会崩溃,这有点烦人。

我认为有些关于重复函数的东西是我没有正确理解的。 有人能够向我展示如何让这个脚本工作吗?

问候

编辑:我已将代码更新为现在的样子,原始代码在其下面。

local mb4_status, exit_flag

local function Move(dx, dy, time, is_interruptable)
local t0 = GetRunningTime()
local prev_dx, prev_dy = 0, 0
repeat
  Sleep(15)
  local part = math.min(time, GetRunningTime() - t0) / time
  local current_dx = math.floor(part * dx)
  local current_dy = math.floor(part * dy)
  local x, y = current_dx - prev_dx, current_dy - prev_dy
  if x ~= 0 or y ~= 0 then
     MoveMouseRelative(x, y)
  end
  prev_dx, prev_dy = current_dx, current_dy
  local prev_mb4_status = mb4_status
  mb4_status = IsMouseButtonPressed(4)
  exit_flag = exit_flag or mb4_status and not prev_mb4_status
  until part == 1 or is_interruptable and exit_flag
  end

  function OnEvent(event, arg)
  if event == "MOUSE_BUTTON_PRESSED" and arg == 4 then
  if exit_flag then
     exit_flag = false
  else
     mb4_status = true
     local x = 44
     repeat
        PressMouseButton(1)
        Move(0, 0, 200, false)  -- 等同于Sleep(200)
        ReleaseMouseButton(1)
        Move(x, 0, 1000, true)  -- 混合了MoveMouseRelative(44,0) + Sleep(1000)
        x = -x
     until exit_flag
  end
  end
  end

function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 8) then
        for i = 1, 1 do
            PressMouseButton(1)
            Sleep(200)
            ReleaseMouseButton(1)
        end
        Sleep(500)
        for i = 5, 15 do
            MoveMouseRelative(4,0)
            Sleep(1)
        end
        Sleep(500)
        for i = 1, 1 do
            PressMouseButton(1)
            Sleep(200)
            ReleaseMouseButton(1)
        end
        Sleep(500)
        for i = 5, 15 do
            MoveMouseRelative(-4,0)
            Sleep(1)
        end
        Sleep(500)
end
end
点赞
用户2858170
用户2858170

我没有测试过这段代码,但至少能够给你一些方法。我的代码检查每次尝试等待的时间过去了多久,并检查等待期间是否有任何按钮被按下以中止。

function OnEvent(event, arg)
if (event == "MOUSE_BUTTON_PRESSED" and arg == 8) then

    local function abortCondition()
      return IsMouseButtonPressed(1) or IsMouseButtonPressed(2) or IsMouseButtonPressed(3)
    end

    local function abortableSleep(delay)
      local startTime = GetRunningTime()
      while GetRunningTime() <= startTime + delay do
        if abortCondition() then return end
        Sleep(5)
      end
      return true
    end

    local function delayedClick(button, delay)
      PressMouseButton(button)
      Sleep(10)
      if not abortableSleep(delay-10) then return end
      ReleaseMouseButton(button)
      return true
    end

    repeat

      if not delayedClick(1, 200) then return end
      if not abortableSleep(500) then return end
      for i = 0, 10 do
        MoveMouseRelative(4,0)
        Sleep(1)
      end
      if not abortableSleep(500) then return end
      if not delayedClick(1, 200) then return end
      for i = 0, 10 do
        MoveMouseRelative(-4,0)
        Sleep(1)
      end
      if not abortableSleep(500) then return end
    until releaseCondition()
  end
end
2021-04-09 08:21:34
用户1847592
用户1847592

请注意,使用 Btn#4 而不是 Btn#8

local mb4_status, exit_flag

local function Move(dx, dy, time, is_interruptable)
   local t0 = GetRunningTime()
   local prev_dx, prev_dy = 0, 0
   repeat
      Sleep(15)
      local part = math.min(time, GetRunningTime() - t0) / time
      local current_dx = math.floor(part * dx)
      local current_dy = math.floor(part * dy)
      local x, y = current_dx - prev_dx, current_dy - prev_dy
      if x ~= 0 or y ~= 0 then
         MoveMouseRelative(x, y)
      end
      prev_dx, prev_dy = current_dx, current_dy
      local prev_mb4_status = mb4_status
      mb4_status = IsMouseButtonPressed(4)
      exit_flag = exit_flag or mb4_status and not prev_mb4_status
   until part == 1 or is_interruptable and exit_flag
end

function OnEvent(event, arg)
   if event == "MOUSE_BUTTON_PRESSED" and arg == 4 then
      if exit_flag then
         exit_flag = false
      else
         mb4_status = true
         local x = 44
         repeat
            PressMouseButton(1)
            Move(0, 0, 200, false)  -- 相当于 Sleep(200)
            ReleaseMouseButton(1)
            Sleep(300)
            Move(x, 0, 1000, true)  -- 混合 MoveMouseRelative(44,0) 和 Sleep(1000)
            Move(0, 0, 300, true)
            x = -x
            local prev_mb4_status = mb4_status
            mb4_status = IsMouseButtonPressed(4)
            exit_flag = prev_mb4_status and not mb4_status
         until exit_flag
      end
   end
end

更新

我在移动和点击之间插入了 sleep 300ms。

要更改距离,请修改 44

时间定时 2001000300 也可以修改。

要更改“开始”按钮,则修改 arg == 4

要更改“停止”按钮,请修改 IsMouseButtonPressed(4)(仅限 2-5)。

请注意,脚本故意忽略“开始”按钮上的每次按键,因为它假设“开始”按钮与“停止”按钮相同。

2021-04-09 18:26:39