我可以在OS X中使用中键拖动来启用滚动吗?


14

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

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

Answers:


9

Smart Scroll采用“Grab Scroll”功能,可以满足您的需求。将其分配到“按钮3(中间)”并在两个轴上拖动将适用于浏览器(Chrome),终端,Adobe Photoshop和Finder等应用程序 - 没有我试过的应用程序没有使用它(使用4.0)贝塔斯向上和向上)。它有一个免费试用版。

在此输入图像描述


1

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

目前,没有软件可以在OS X中启用此类功能,遗憾的是。


也许它在2011年与Chrome不兼容,但肯定在2014年,无疑有相当多的修改,Smart Scroll的'Grab Scroll'与Chrome和Opera顺利运行,我可以证实。我认为它也适用于操作系统,因为它适用于Finder,Adobe Photoshop甚至终端。所以我认为你的数据已经过时了!:)

1

除其他外,Smooze做到了这一点。(我是开发人员)

例如,它与其他建议的不同之处在于能够在每个mac应用程序中使用它,同时仍然可以识别链接。(如果您使用中间按钮拖动抓取并抛出但仍希望中间按钮单击将充当中间按钮)

随着Smooze更像是抓住拖拽而不是抓取拖拽。该版本影响了滚动的动量和动画,类似于iPhone滚动。

在此输入图像描述


1

有一个非常好的开源应用程序称为Karabiner,它将执行此操作以及更多(键盘和鼠标重新映射等)。请参阅此问题以获取一些示例。此外,对于某些制造商,他们提供定制控制软件,可以允许改进/修改功能(例如罗技控制中心)。

正如下面的评论中提到的那样,虽然新版本的'Karabiner Elements'已经发布用于MacOS Sierra(10.12),但它目前仅提供基于键盘的重映射 - 因此目前无法使用鼠标重新映射。

然而,Hammerspoon是另一种免费的开源工具,可以用于将鼠标(和/或键盘)上的键重新映射到不同的功能。您需要安装该工具并为其提供一些适当的配置 - 请参阅此处的示例以进行鼠标重新映射。

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

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

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


1
不幸的是,Karabiner不再适用于现代OSX。现在可以使用'Karabiner Elements',但它具有原始功能的一半,这是它无法做到的事情之一。
弥敦道Hornby

1
是的,它目前有限,所以我更新了我的答案,添加另一个解决方案。
Pierz

Hammerspoon是我昨天登陆的解决方案,所以很好的建议!:)由于某种原因,我无法将其绑定到其中一个鼠标按钮,但将其映射到ctrl + cmd似乎工作正常。
弥敦道霍恩比

1
我添加了另一个编辑,因为我在安装了LCC时遇到了这个问题,但是卸载它修复它(一旦我工作了哪个按钮生成了哪个mouseEventButtonNumber - 在我的Marble鼠标左边的迷你按钮是3,右边是4) 。
Pierz

我怀疑可能是这个问题!感谢您的确认,我会在有机会的时候解决这个问题。
弥敦道Hornby

1

我用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()
    

只是尝试过,它的工作非常精彩。
im_chc

因为我更倾向于使Y滚动反过来,所以我稍微更改了lua代码:在“local scroll = hs.eventtap.event.newScrollEvent({ - dx * scrollmult,{ - dx * scrollmult, dy * scrollmult},{},'pixel')“to negative(所以它会是”-dy * scrollmult“)
im_chc

0

我使用Better Touch Tool将Ctrl +中键单击分配给PgUp,选项+中键单击分配给PgDown。它是免费的,优秀的软件,并且运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.