このページの本文へ

前へ 1 2 次へ

Windows Info 第329回

Windowsでコマンドラインからウィンドウ部分だけを画面キャプチャーする

2022年05月29日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

今回のプログラムの解説

 今回紹介したプログラムだが、先頭部分は、Win32APIの呼出をC#のプログラムで定義している。PowerShellでは、こうやって文字列としてC#のプログラムを入れて、それを21行目にある「Add-Type $src」のようにAdd-Typeコマンドで登録すると、C#プログラムをコンパイルして登録してくれる。回りの「try { ~ } catch {}」は、エラーのトラップである。

 ここでは、2つのWin32APIを登録している。

●GetForegroundWindow function
 https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getforegroundwindow
●DwmGetWindowAttribute function
 https://docs.microsoft.com/ja-jp/windows/win32/api/dwmapi/nf-dwmapi-dwmgetwindowattribute

 「GetForegroundWindow」は、カレントウィンドウのウィンドウハンドルを返す関数だ。これに対して「DwmGetWindowAttribute」は、ウィンドウの左上と右下の座標を返すための関数。以前のWindowsでは、ウィンドウの座標は「GetWindowRect」で求めるものだったが、Windows 10/11では、この関数はウィンドウ周囲の影の部分を含んだ座標を返す。なので、これでキャプチャーしてしまうと、ウィンドウの外側まで入る。

 「DwmGetWindowAttribute」は、さまざまな情報を返す関数なのだが、そのうちの1つに影の部分を含まないウィンドウの座標を返すという機能がある。ただし、呼びだし方が面倒なので、ここでは、「GetWRect」というメソッドを定義し、PowerShellからは、これを呼び出す。具体的には、

[WindowRect]::GetWRect($hWnd)

とする。

 PowerShellの「Get-WindowCaptureByHandle」関数(27行目)で、この関数を使い、ウィンドウハンドルから、ウィンドウの左上、右上の座標を得て、「Get-CaptureRect」関数(22行目)を呼び出している。

 「Get-CaptureRect」関数は、前々回に解説した範囲を指定してデスクトップの一部をキャプチャーする関数だ。その範囲としてウィンドウの範囲を入れてやることで、ウィンドウだけの画像を得ることができる。

 「GetForegroundWindow」は、カレントウィンドウのウィンドウハンドルを返す。具体的には、

[WindowRect]::GetForegroundWindow()

とする(リスト37行目)。ウィンドウハンドルが得られれば、「Get-WindowCaptureByHandle」関数を使って、ウィンドウのキャプチャーができる。

 サンプルの関数、「Save-CurrentWindowCapture」は、これを利用したもの。キャプチャーから保存、ビットマップの後始末までの一連の手順を記述してある。

 やむを得ず、今回はプログラムの話になってしまったが、ここで定義した関数などを使うことで、デスクトップ内の特定の範囲やウィンドウハンドルで指定したウィンドウのキャプチャーが可能になる。もともと、このプログラムは、デバッグ用に画面を撮影し続けるために作成したもので、エラー処理などまったくしていない。実用にはほど遠いので、必要に応じて書き換えて使っていただきたい。また、ご自身のリスクで利用してほしい。何かあっても筆者も編集部も責任を取ることはできない旨、理解されたい。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン