今回のプログラムの解説
今回紹介したプログラムだが、先頭部分は、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」は、これを利用したもの。キャプチャーから保存、ビットマップの後始末までの一連の手順を記述してある。
やむを得ず、今回はプログラムの話になってしまったが、ここで定義した関数などを使うことで、デスクトップ内の特定の範囲やウィンドウハンドルで指定したウィンドウのキャプチャーが可能になる。もともと、このプログラムは、デバッグ用に画面を撮影し続けるために作成したもので、エラー処理などまったくしていない。実用にはほど遠いので、必要に応じて書き換えて使っていただきたい。また、ご自身のリスクで利用してほしい。何かあっても筆者も編集部も責任を取ることはできない旨、理解されたい。
この連載の記事
-
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 - この連載の一覧へ