在 Hammerspoon 中长按鼠标键进行滚动

我正在尝试在 Mac 上的 Hammerspoon 上设置一个 Lua 脚本,以便当我按住鼠标的后/前侧按钮时,只要按键不释放,我就可以持续向上和向下滚动。以下是我目前拥有的代码:

back    = 3
forward = 4
pixels  = 50
fast_scroll = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
   local pressed = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
   print(pressed)
   if     pressed == back    then sign=-1
   elseif pressed == forward then sign= 1
   else return false, {}
   end
   local scroll = hs.eventtap.event.newScrollEvent({0, sign*pixels},{},'pixel')
   return true, {scroll}
end)
fast_scroll:start()

这段代码可以让我每次按下侧按钮时进行滚动,但仅滚动一次。要继续滚动,我需要释放侧键,再次点击并重复。似乎我需要一些循环,但我不太确定如何在 Hammerspoon 中实现。任何提示都将不胜感激。

原文链接 https://stackoverflow.com/questions/70717694

点赞
stackoverflow用户893099
stackoverflow用户893099

一种解决方法是在鼠标按钮按下时启动计时器,在鼠标按钮释放时停止计时器。

这里是一个我快速组合的例子,只要我按住右鼠标按钮,就会向下滚动。您需要根据像素和传递给计时器的时间间隔进行调整,以获得自然的滚动效果。每20ms滚动50个像素对我来说感觉不错。

local pixels = 50

-- 1s / 50 = 20ms
local scrollDownTimer = hs.timer.new(1 / 50, function()
  hs.eventtap.event.newScrollEvent({0, -1*pixels},{},'pixel'):post()
end)

local events = hs.eventtap.event.types
mouseTracker = hs.eventtap.new({ events.rightMouseDown, events.rightMouseUp }, function (e)
  local sign = -1

  if e:getType() == events.rightMouseUp then
    scrollDownTimer:stop()
  elseif e:getType() == events.rightMouseDown then
    scrollDownTimer:start()
    -- for the first scroll, don't wait until the timer expires
    local scroll = hs.eventtap.event.newScrollEvent({0, -1*pixels},{},'pixel')
  end

  return true, { scroll }
end)
mouseTracker:start()
2022-07-04 17:23:43