我可以在 OS X 中通过中键拖动启用滚动吗?

kdt*_*kdt 22 scrolling macos

我有一个带三个按钮但没有滚轮的鼠标。

在 OS X 中,是否有任何方法(也许使用插件软件)可以让我通过按住并移动鼠标来使用我的第三个按钮进行滚动?

小智 13

Smart Scroll具有“抓取滚动”功能,可满足您的需求。将它分配给“按钮 3(中间)”并在两个轴上拖动将适用于浏览器 (Chrome)、终端、Adobe Photoshop 和 Finder 等应用程序 - 我尝试过的任何应用程序都无法使用它(使用 4.0测试版向上和向上)。它有一个免费试用。

智能滚动截图


Ale*_*sel 13

我使用Hammerspoon使用以下受此线程启发的配置脚本进行了操作:https : //github.com/tekezo/Karabiner/issues/814#issuecomment-337643019

脚步:

  • 安装 Hammerspoon
  • 单击其菜单图标并选择 Open Config
  • 将以下lua脚本粘贴到配置中:

    -- HANDLE SCROLLING WITH MOUSE BUTTON PRESSED
    local scrollMouseButton = 2
    local deferred = false
    
    overrideOtherMouseDown = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
        -- print("down")
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        if scrollMouseButton == pressedMouseButton 
            then 
                deferred = true
                return true
            end
    end)
    
    overrideOtherMouseUp = hs.eventtap.new({ hs.eventtap.event.types.otherMouseUp }, function(e)
        -- print("up")
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        if scrollMouseButton == pressedMouseButton 
            then 
                if (deferred) then
                    overrideOtherMouseDown:stop()
                    overrideOtherMouseUp:stop()
                    hs.eventtap.otherClick(e:location(), pressedMouseButton)
                    overrideOtherMouseDown:start()
                    overrideOtherMouseUp:start()
                    return true
                end
                return false
            end
            return false
    end)
    
    local oldmousepos = {}
    local scrollmult = -4   -- negative multiplier makes mouse work like traditional scrollwheel
    
    dragOtherToScroll = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDragged }, function(e)
        local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
        -- print ("pressed mouse " .. pressedMouseButton)
        if scrollMouseButton == pressedMouseButton 
            then 
                -- print("scroll");
                deferred = false
                oldmousepos = hs.mouse.getAbsolutePosition()    
                local dx = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaX'])
                local dy = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaY'])
                local scroll = hs.eventtap.event.newScrollEvent({-dx * scrollmult, dy * scrollmult},{},'pixel')
                -- put the mouse back
                hs.mouse.setAbsolutePosition(oldmousepos)
                return true, {scroll}
            else 
                return false, {}
            end 
    end)
    
    overrideOtherMouseDown:start()
    overrideOtherMouseUp:start()
    dragOtherToScroll:start()
    
    Run Code Online (Sandbox Code Playgroud)


Pie*_*erz 5

更新(2022):有一个名为Karabiner Elements的新开源应用程序,它可以执行此操作以及更多操作 - 它可以执行键盘和鼠标重新映射等操作。

这取代了旧的“Karabiner”应用程序(请参阅此问题以获取[旧]一些示例),并且现在提供鼠标和键盘重新映射,如 @Nathan 在评论中提到的。

另一个选择是Hammerspoon,它也是一个开源工具,可用于将鼠标(和/或键盘)上的按键重新映射到不同的功能。您需要安装该工具并为其提供一些适当的配置 - 请参阅此处有关鼠标重新映射的示例。

要检查您的设备正在生成哪些事件类型和 mouseEventButtonNumbers,您可以在 Hammerspoon 控制台中运行此命令(只需将 4 行复制/粘贴到控制台中)(用于reload config停止它):

hs.eventtap.new({"all"},function(e)
print(e,"mouseEventButtonNumber:",
e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber']))
end):start()
Run Code Online (Sandbox Code Playgroud)

注意:如果您安装了 Logitech Control Center (LCC) 工具 - 它会使用已安​​装的内核模块直接从 Logitech 设备获取事件,因此 Hammerspoon 无法看到它们。如果您想使用 Hammerspoon 重新映射鼠标按钮,则需要卸载 LCC。

  • 不幸的是 Karabiner 不再适用于现代 OSX。现在有一个“Karabiner Elements”可以做到这一点,但它的功能只有原来的一半,而这是它无法做到的事情之一。 (2认同)

小智 5

除其他外,Smooze就是这样做的。(我是开发者)

例如,它与其他建议的区别在于能够在每个 mac 应用程序中使用它,同时仍然可以识别链接。(如果您使用中键拖动来抓取和投掷,但仍希望单击中键充当中​​键)

使用 Smooze 更像是抓拖投而不是抓拖。释放影响滚动的动量和动画,类似于 iPhone 滚动。

在此处输入图片说明


小智 1

这取决于软件 - 例如,Firefox 支持它,而 Google Chrome 则不支持。

遗憾的是,目前还没有软件可以在 OS X 系统范围内启用此类功能。