2017-07-20 26 views
0

更新到Sierra后,我必须发现Karabiner不再工作,这可以很好地模拟指针点击。macOS Sierra:模拟鼠标向下和向上

有没有机会通过Swift或Apple Script或Obj.C获取?

背景:使用Karabiner(和seil)我可以将caps-lock + d向下和向上绑定到鼠标上,并在触控板之间移动被理解。我的触控板不再处理按键,但对指针移动仍然有效。

回答

0

回答我自己,在hammerspoon中入侵它。通过铁锁元素我映射到capslock

1 ~/.hammerspoon $ cat init.lua 



--[[ Left Keyboard Mouse (alt-d) 

The main problem was to get chrome based apps select text when we drag via 
keyboard. 

You MUST return true always in the handle_drag otherwise it fails to select. 
FF works, terminal works, chrome apps (atom, ...) don't. 

But true is preventing further processing of the drag coords, 
hs.mouse.getAbsolutePosition remains constant while dragging (!) 
=> i.e. we MUST calc them via DeltaX, DeltaY, see below. 


--]] 

hs.alert.show("Config loaded") 

-- all mechanics stolen from here: 
-- local vimouse = require('vimouse') 
-- vimouse('cmd', 'm') 

now = hs.timer.secondsSinceEpoch 

evt = hs.eventtap 
evte = evt.event 
evtypes = evte.types 
evp=evte.properties 

drag_last = now(); drag_intv = 0.01 -- we only synth drags from time to time 

mp = {['x']=0, ['y']=0} -- mouse point. coords and last posted event 
l = hs.logger.new('keybmouse', 'debug') 
dmp = hs.inspect 

-- The event tap. Started with the keyboard click: 
handled = {evtypes.mouseMoved, evtypes.keyUp } 
handle_drag = evt.new(handled, function(e) 

    if e:getType() == evtypes.keyUp then 
     handle_drag:stop() 
     post_evt(2) 
     return nil -- otherwise the up seems not processed by the OS 
    end 

    mp['x'] = mp['x'] + e:getProperty(evp.mouseEventDeltaX) 
    mp['y'] = mp['y'] + e:getProperty(evp.mouseEventDeltaY) 

    -- giving the key up a chance: 
    if now() - drag_last > drag_intv then 
     -- l.d('pos', mp.x, 'dx', dx) 
     post_evt(6) -- that sometimes makes dx negative in the log above 
     drag_last = now() 
    end 
    return true -- important 
end) 

function post_evt(mode) 
    -- 1: down, 2: up, 6: drag 
    if mode == 1 or mode == 2 then 
     local p = hs.mouse.getAbsolutePosition() 
     mp['x'] = p.x 
     mp['y'] = p.y 
    end 
    local e = evte.newMouseEvent(mode, mp) 
    if mode == 6 then cs = 0 else cs=1 end 
    e:setProperty(evte.properties.mouseEventClickState, cs) 
    e:post() 
end 

hs.hotkey.bind({"alt"}, "d", 
    function(event) 
    post_evt(1) 
    handle_drag:start() 
    end 
) 

alt:是相当棘手的铬选择的工作,也许这样可以节省别人一两个小时。

相关问题