2024年12月27日金曜日

HammerSpoon で Mac の自動操作入門

HammerSpoon で Mac の自動操作入門

概要

Hammerspoon は Mac でショートカットキーを設定しそのショートカットキーに割り当てられたスクリプトを実行し Mac の操作を自動化できるツールです
今回はインストールからマウスクリックとスワイプ操作を実装してみました

環境

  • macOS 15.2
  • hammerspoon 1.0.0

インストール

  • brew install hammerspoon

アプリケーションの一覧に hammerspoon のアイコンがあるのでクリックして起動します

するとツールバーに hammerspoon のアイコンが常駐するようになるのでこれで起動完了です

権限の付与

システム設定 -> プライバシーとセキュリティ -> アクセシビリティ

で権限を付与してあげましょう

通知の許可

システム設定 -> 通知

から hammerspoon の通知を許可してあげましょう

Hello World

まずは Hello World です

ツールバーにある hammerspoon のアイコンをクリックし「Open config」を選択します

するとテキストエディタが起動するので以下の lua スクリプトを貼り付けましょう

hs.hotkey.bind({"cmd", "alt", "ctrl"}, "W", function()
  hs.alert.show("Hello World!")
end)

これで準備 OK です
ツールバーのアイコンから「Reload config」しキーボードで cmd + ctrl + alt + w キーを押すと Hello World と表示されることが確認できます

ファイルの場所は

Open config で開けるファイル ~/.hammerspoon/init.lua にあります
これを直接好きなエディタで編集してから Reload config しても OK です

特定の箇所をクリックする

長いのでキーは cmd + alt + c にしています
特定の箇所を左クリックする場合は hs.eventtap.leftClick します
最後に完了を知らせるために hs.notify.new で通知していますが毎回通知が来て面倒という場合には Hello World で使った hs.alert.show を使うのがいいかなと思います

lua の場合コメントハイフン2つで表現します

hs.hotkey.bind({"cmd", "alt"}, "C", function()
    -- 座標を指定してクリック (: X=500, Y=300)
    local clickPoint = {x=500, y=300}
    
    -- マウスカーソルを指定位置に移動
    hs.mouse.absolutePosition(clickPoint)
    
    -- 左クリックイベントを発生させる
    hs.eventtap.leftClick(clickPoint)

    -- 通知でクリック完了を知らせる (任意)
    hs.notify.new({title="Hammerspoon", informativeText="Left click at (500, 300)"}):send()
end)

スワイプ(ドラッグアンドドロップ)

なぜかテキストが選択状態にはならないようですがちゃんとこれでドラッグアンドドロップできてします

newMouseEvent で leftMouseDown して押しっぱなしにしたあとに移動させて leftMouseUp させます

hs.hotkey.bind({"cmd", "alt"}, "C", function()
    -- スワイプの開始座標と終了座標を設定
    local startPoint = {x=500, y=500}
    local endPoint = {x=700, y=700}

    -- マウスカーソルを開始位置に移動
    hs.mouse.absolutePosition(startPoint)
    hs.timer.usleep(50000) -- 50ms待機

    -- マウスダウン (押しっぱなしにする)
    local mouseDown = hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseDown, startPoint)
    mouseDown:post()
    hs.timer.usleep(300000) -- 300ms待機 (長押しエミュレート)

    -- スワイプの動作 (滑らかな移動)
    local steps = 50 -- ステップ数
    for i = 1, steps do
        local progress = i / steps
        local currentPoint = {
            x = startPoint.x + (endPoint.x - startPoint.x) * progress,
            y = startPoint.y + (endPoint.y - startPoint.y) * progress
        }
        hs.mouse.absolutePosition(currentPoint)
        hs.timer.usleep(5000) -- 5ms待機 (スムーズに移動)
    end

    -- マウスアップ (クリック解除)
    local mouseUp = hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseUp, endPoint)
    mouseUp:post()
end)

以下で強制的にウィンドウをアクティブにしても選択状態にはなりませんでした
テキストを選択状態にするには別の方法があるのかもしれません

local app = hs.application.get("Google Chrome")
if app then
    app:activate() -- アプリケーションをアクティブにする
else
    hs.alert.show("Google Chrome is not running!")
end

最後に

Mac の HammerSpoon で Mac の自動操作を試してみました
ショートカットキーをフックにして動作するのでこのあたりも自動化できるとさらに便利かなと思いました

他にもいろいろと使い道がありそうなのでもう少し触ってみて追加の Tips があればまた紹介します

参考サイト

0 件のコメント:

コメントを投稿