今回のプログラムの解説
今回紹介したプログラムだが、先頭部分は、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」は、これを利用したもの。キャプチャーから保存、ビットマップの後始末までの一連の手順を記述してある。
やむを得ず、今回はプログラムの話になってしまったが、ここで定義した関数などを使うことで、デスクトップ内の特定の範囲やウィンドウハンドルで指定したウィンドウのキャプチャーが可能になる。もともと、このプログラムは、デバッグ用に画面を撮影し続けるために作成したもので、エラー処理などまったくしていない。実用にはほど遠いので、必要に応じて書き換えて使っていただきたい。また、ご自身のリスクで利用してほしい。何かあっても筆者も編集部も責任を取ることはできない旨、理解されたい。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第539回
PC
AIを組み込んだWindowsターミナル「Intelligent Terminal」をインストールして試してみる -
第538回
PC
Windows 11に付属の新しいOutlookでアカウント設定をする -
第537回
PC
PowerShellをシェルとして使うためのポイントを解説 -
第536回
PC
Microsoft製のコンソールエディタMS-Editが2.0になり、文法ハイライト機能が搭載 -
第535回
PC
WSLコンテナーのプレビューを試す 今年はWSLに動きがありそうだ -
第534回
PC
Windows 11におけるアプリインストーラーとwinget -
第533回
PC
PCの世界ではすっかり存在感が薄くなった光学メディアをあらためて整理 -
第532回
PC
モニターの情報が含まれる「VESA EDID」をWindowsで調べる方法 -
第531回
PC
Windowsのコンソール上でUnix/Linuxの標準的なコマンドを動かす「Windows CoreUtils」 -
第530回
PC
Windows 11でタスクバーの位置の移動機能が復活するのは結局どうなった? プレビュー版の現状を見る -
第530回
PC
PowerShellをシェルとして使うためのポイント【情報表示のやり方】 - この連載の一覧へ











