2024年12月28日土曜日

HammerSpoon でドラッグアンドドロップする方法

HammerSpoon でドラッグアンドドロップする方法

概要

過去 に HammerSpoon で紹介しましたがうまく動作しないケースがあるようです
その場合は event.types.leftMouseDragged イベントをうまく使うとドラッグアンドドロップできるようになります

環境

  • macOS 15.2
  • HammerSpoon 1.0.0

ドラッグアンドドロップする関数

function dragMouse(pointA, pointB, sleep)
    local event = hs.eventtap.event
    local xdiff = pointB.x - pointA.x
    local ydiff = pointB.y - pointA.y
    -- ここの割り算の3の数が少ないほどドラッグが滑らかになる
    -- 速いドラッグにしたい場合は数を大きくする
    local loop = math.floor(math.sqrt((xdiff * xdiff) + (ydiff * ydiff)) / 3)
    local xinc = xdiff / loop
    local yinc = ydiff / loop
    sleep = math.floor((sleep * 1000) / loop)
    midPoint = {x=pointA.x, y=pointA.y}
    for i = 1,loop do
        midPoint.x = midPoint.x + xinc
        midPoint.y = midPoint.y + yinc
        newPoint = {x = math.floor(midPoint.x), y = math.floor(midPoint.y)}
        hs.mouse.absolutePosition(newPoint)
        event.newMouseEvent(event.types.leftMouseDragged, newPoint):post()
        hs.timer.usleep(sleep)
    end
    newPoint = {x = math.floor(pointB.x), y = math.floor(pointB.y)}
    hs.mouse.absolutePosition(newPoint)
    event.newMouseEvent(event.types.leftMouseDragged, newPoint):post()
end

使い方

hs.hotkey.bind({"cmd", "alt"}, "T", function()
    local upSlideStartPoint = {x=500, y=500}
    local upSlideEndPoint = {x=200, y=200}
    -- カーソル位置を移動
    hs.mouse.absolutePosition(upSlideStartPoint)
    -- マウスを押した状態にする
    hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseDown, upSlideStartPoint):post()
    -- マウスを押しながら移動する
    -- 1の数字の部分を調整することでドラッグアンドドロップのスピードが変わる
    -- 数が少ないほど速くなる
    dragMouse(upSlideStartPoint, upSlideEndPoint, 1)
    -- マウスを離す
    hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseUp, upSlideEndPoint):post()
end)

最後に

ポイントはカーソルを移動した際に event.types.leftMouseDragged を実行する点かなと思います

多くのサンプルはマウスダウンをしてそのままカーソルを移動してその後マウスを上げるになっているのですがそれだとダメなようです

0 件のコメント:

コメントを投稿