概要
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 件のコメント:
コメントを投稿