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はウインドウの内容だけを撮影するため、ほかのウインドウが重なっていても写らない。
-Rで範囲を指定して撮影すると、手前にあるウインドウも写る。

同じ状態で-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

影がない分、画像のサイズはウインドウの大きさと同じになる。783x483ポイントのアクティブなウインドウを撮影すると、影ありでは895x595、影なしでは783x483の画像になる。影の大きさはウインドウがアクティブかどうかで変わる。同じウインドウが非アクティブの場合、影ありでは851x551の画像になる。
キーボードショートカットでウインドウを撮影するときの影の有無は、defaults write com.apple.screencapture disable-shadowで変更できる。
参考: 【Mac】スクリーンキャプチャにつく余白を無くしたい
-aで付属するウインドウを含めない
保存ダイアログのシートのように、ウインドウに付属して表示されるウインドウがある。-lはデフォルトで、付属するウインドウも含めて撮影する。

-aを指定すると、付属するウインドウを含めずに撮影する。
$ screencapture -a -l 34477 window.png

