2017-07-20 60 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:是相當棘手的鉻選擇的工作,也許這樣可以節省別人一兩個小時。