screencaptureの-lオプションを使うと、ウインドウIDを指定して特定のウインドウだけを撮影できる。Command+Shift+4の後にSpaceキーを押してウインドウをクリックする操作を、コマンドから実行できる。ここではウインドウIDの調べ方と、-o・-aで撮影結果を調整する方法をまとめる。

screencaptureの基本的な使い方は以下を参照。

参考: 【screencapture】コマンドで画面全体のスクリーンショットを撮る

ウインドウIDを調べる

-lにはウインドウIDを指定する。ウインドウIDは、macOSのウインドウサーバーがウインドウごとに割り当てる番号である。

AppleScriptに対応したアプリの場合

TextEditやFinderなど、AppleScriptに対応したアプリであれば、id of front windowでウインドウIDを取得できる。

$ osascript -e 'tell application "TextEdit" to id of front window'
34477

すべてのウインドウを一覧表示する

AppleScriptに対応していないアプリの場合は、JavaScript for Automation(JXA)からCore GraphicsのCGWindowListCopyWindowInfoを呼び出して一覧を取得する。

$ osascript -l JavaScript -e 'ObjC.import("CoreGraphics"); const l = ObjC.deepUnwrap(ObjC.castRefToObject($.CGWindowListCopyWindowInfo(1, 0))); l.filter(w => w.kCGWindowLayer === 0).map(w => `${w.kCGWindowNumber} ${w.kCGWindowOwnerName} ${w.kCGWindowName || ""}`).join("\n")'
34602 テキストエディット 名称未設定2
34477 テキストエディット 名称未設定
...

左からウインドウID、アプリ名、ウインドウのタイトルである。CGWindowListCopyWindowInfoの第1引数の1は、画面に表示されているウインドウだけを取得する指定である。Dockにしまったウインドウも含めたい場合は、第1引数を0にする。kCGWindowLayerが0のウインドウに絞り込むと、メニューバーなどを除いた通常のウインドウだけになる。

アプリ名は日本語環境では「テキストエディット」のようにローカライズされた名前になる。ウインドウのタイトルを取得するには、ターミナルアプリに画面収録の権限が必要である。

-lでウインドウを撮影する

-l <ウインドウID>の形式で指定する。-l34477のように、オプションとウインドウIDの間のスペースは省略できる。

$ screencapture -l 34477 window.png

ウインドウの周りの影も含めて撮影される。

-lで撮影したウインドウ

ほかのウインドウに隠れていても撮影できる

-lはウインドウの内容だけを撮影するため、ほかのウインドウが重なっていても写らない。

-Rで範囲を指定して撮影すると、手前にあるウインドウも写る。

-Rで撮影すると手前のウインドウも写る

同じ状態で-lを使うと、奥にあるウインドウだけを撮影できる。

-lで撮影すると奥のウインドウだけが写る

参考: 【screencapture】-Rで範囲を指定して撮影する

Dockにしまったウインドウも、-lで撮影できる。

存在しないウインドウIDを指定した場合

存在しないウインドウIDを指定すると、エラーになる。終了ステータスは1である。

$ screencapture -l 999999 window.png
could not create image from window

-oでウインドウの影を含めない

-oを指定すると、ウインドウの影を含めずに撮影する。

$ screencapture -o -l 34477 window.png

-oで影を含めずに撮影したウインドウ

影がない分、画像のサイズはウインドウの大きさと同じになる。783x483ポイントのアクティブなウインドウを撮影すると、影ありでは895x595、影なしでは783x483の画像になる。影の大きさはウインドウがアクティブかどうかで変わる。同じウインドウが非アクティブの場合、影ありでは851x551の画像になる。

キーボードショートカットでウインドウを撮影するときの影の有無は、defaults write com.apple.screencapture disable-shadowで変更できる。

参考: 【Mac】スクリーンキャプチャにつく余白を無くしたい

-aで付属するウインドウを含めない

保存ダイアログのシートのように、ウインドウに付属して表示されるウインドウがある。-lはデフォルトで、付属するウインドウも含めて撮影する。

付属するウインドウも含めて撮影したウインドウ

-aを指定すると、付属するウインドウを含めずに撮影する。

$ screencapture -a -l 34477 window.png

-aで付属するウインドウを含めずに撮影したウインドウ

参考

ScreenCapture Command: Capture an image of the screen in macOS