Tech Racho エンジニアの「?」を「!」に。
  • IT Tips

MacのスクリーンキャプチャはAppleScriptで書いてアプリ化すると便利

Macのスクリーンショットを改善するアプリは昔から山ほどありますが、使いもしないトゥーマッチな機能がたくさんあって重たいなど、自分が欲しい機能に合うものがなかなかなくて長年困っていました。正直、以下さえできれば他に何も要りません。

  • 起動すると十字カーソルが表示され、領域を選択できる
  • 手を離して領域選択を終えると、即スクリーンショットを撮影する
  • ファイルの保存場所をカスタマイズする
  • ファイル名のフォーマットをカスタマイズする(yyyymmdd_hhmmss)
  • 同時にクリップボードにも保存する

画像のトリミングは、Mac標準のプレビューアプリで私には十分です。

検討の結果、AIにAppleScriptで書いてもらってスクリプトエディタでMacのアプリとして保存し、それをRaycastのショートカットで起動するようにしたところ、やっと自分の欲しいスクリーンキャプチャができるようになりました🎉😂

-- SAVE_DIR_POSIX の値は各自で変更してください
property SAVE_DIR_POSIX : "/Users/hachi8833/Pictures/screenshot"

on run
    do shell script "mkdir -p " & quoted form of SAVE_DIR_POSIX

    set ts to do shell script "date +%Y%m%d_%H%M%S"
    set outPath to SAVE_DIR_POSIX & "/" & ts & ".png"

    -- キャプチャ(Escキャンセルは静かに終了)
    try
        do shell script "/usr/sbin/screencapture -i -t png " & quoted form of outPath
    on error
        return
    end try

    -- ファイルが存在しない場合も終了(重要)
    try
        do shell script "test -f " & quoted form of outPath
    on error
        return
    end try

    -- クリップボード用TIFF作成
    set tmpTiff to "/private/tmp/shot_" & ts & ".tiff"
    do shell script "/usr/bin/sips -s format tiff " & quoted form of outPath & " --out " & quoted form of tmpTiff & " >/dev/null"

    -- TIFFがなければ終了
    try
        do shell script "test -f " & quoted form of tmpTiff
    on error
        return
    end try

    -- クリップボードへ(画像として)
    do shell script "/usr/bin/osascript -e " & quoted form of ¬
        ("set the clipboard to (read (POSIX file \"" & tmpTiff & "\") as TIFF picture)")
end run
  • いったんTIFFに変換しているのは、AIによればTIFFが最も安定しているからだそうです。
  • 領域選択中にEscキーを押せばキャプチャせずに終了します。
  • Mac標準の/usr/sbin/screencaptureを使っているので、キャプチャ後にMac標準のキャプチャ音も鳴らしてくれます。

何より、スクリーンキャプチャアプリを常駐させる必要がないのが嬉しい点です👍

アプリ化するときに注意すべき点

Mac標準のスクリプトエディタで新規スクリプトを作成し、上のAppleScriptを貼り付けてSAVE_DIR_POSIXの保存先を適宜変更したら、アプリケーションとしてとしてアプリケーションフォルダに保存します(「実行専用」はオンオフどちらでも構いません)。

私の場合はCaptureMan.appという名前にしました。

しかしこのときいくつか注意点があります。原因がわかるまでハマりました。

  • アプリは必ずアプリケーションフォルダ(/Applications/)に保存すること

  • アプリを保存したら、まずターミナルを開いて以下を実行すること(アプリ名は自分のアプリ名に置き換えてください)

# アプリは必ず/Applications/に配置しておくこと
APP=/Applications/アプリ名.app

# そのうえで以下の4つのコマンドを実行
defaults write "$APP/Contents/Info" LSUIElement -bool true
xattr -cr $APP
dot_clean -m $APP
codesign --force --deep --sign - $APP

コマンドの意味は以下のとおりです(いずれもroot権限は不要)。

defaults write "$APP/Contents/Info" LSUIElement -bool true
LSUIElementtrueに設定することで、キャプチャしたいウィンドウをアクティブなままにできる。
xattr -cr $APP
アプリを不安定にしがちな隔離属性を再帰的にクリアする
dot_clean -m $APP
._ などの二重化メタデータをクリアする
codesign --force --deep --sign - $APP
アプリに署名する(アプリを配布するなら必要)

LSUIElementを設定しないと、キャプチャしようとしたウィンドウがアクティブでなくなって表示色が変わってしまうことがあります。

アプリを有効にする

キャプチャアプリを恒常的に使えるようにするには、権限を有効にする必要があります。

保存したアプリを初めて起動すると、カーソルが十字カーソルに変わり、領域を選択可能になります。
領域を選択すると、まず以下が表示されるので、[システム設定を開く]をクリックします。

表示された[画面収録とオーディオ録音]で、起動したAppleScriptアプリ名が表示されていることを確認し、スイッチをオンにします。

ここで再度アプリを起動して領域を選択すると、今度は以下のダイアログが表示されるはずです。これを[許可]しないとアプリが動かず、1個目のダイアログが毎回表示されてしまいます。

今回最もハマったのはこの点で、上述のxattr -cr $APPdot_clean -m $APPを実行しないと、この2つ目のダイアログが表示されませんでした(状況やアプリの名前にもよるかもしれませんが)。もし表示されない場合は、上述のコマンドを正しく実行したかどうかを確認してください。

アプリを起動するショートカットを設定する

後は、好みの方法でこのキャプチャアプリを起動するショートカットを設定すれば完了です。

私の場合はRaycastという強力なランチャーを使って、このキャプチャアプリにショートカット(私の場合は標準と同じ⌘+Shift+3)を設定しています。これならキャプチャアプリを常駐させる必要もありません😋

なお、Raycastのおかげで以下の常駐アプリを使わずに済むようになり、⌘+Ctrl+Spaceによる絵文字入力UIも使いやすくなりました。Mac/Windowsどちらにもおすすめです👍

  • Rectangle: ウィンドウ位置をキーで操作する
  • Alfred: ランチャー
  • Better Touch Tool: キーショートカットのカスタマイズ
  • Espanso: キーマクロ(主にテキスト用)

関連記事

macOS: ファイルを削除してもディスク容量が減らない場合はdittoを試してみよう

macOS Sonomaのかな漢字変換で表示される吹き出しを消す方法


関連記事

該当する記事がありません。

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。