【LabVIEW】アクティブウィンドウのスクリーンショット取得方法

本記事ではアクティブウィンドウのスクリーンショットを取得する方法について記載をしていきます。

WindowsのAPI関数などを使用してスクリーンショットを取得しています。

メインディスプレイやフロントパネルのスクリーンショットを取得する方法については、すぐに検索をしても出てきますが、アクティブウィンドウについては出てこなかったので記載しています。

参考にしたLabVIEWのサンプルVI

下記のプログラムを参考にしてLabVIEWでアクティブウィンドウのスクリーンショットを取得していきます。

アクティブウィンドウのウィンドウハンドル情報を取得

アクティブウィンドウの情報を取得してくれるVIです。

Windowsにあるuser32.dllのAPIを使用して、アクティブウィンドウの情報を取得します。

アクティブウィンドウのウィンドウハンドルを取得するためにライブラリ関数呼び出しノードを使用します。

GetForegroundWindow関数を使用してアクティブウィンドウのウィンドウハンドルを取得します。取得したウィンドウハンドルを次のウィンドウに関する関数に渡すことで、別の情報を取得していくことが出来ます。

関数
ライブラリ名:user32.dll
関数名:GetForegroundWindow
呼び出し規約:stdcall(WINAPI)

パラメータ
名前:返り値タイプ
タイプ:数値
データタイプ:符号付きポインタサイズ整数

ウィンドウの位置とサイズ情報を取得

Windowsのuser32.dllのAPIを使用するためのサンプルプログラムを多数ライブラリ形式で公開されています。

このアクティブウィンドウのスクリーンショットをするためにウィンドウの位置とサイズを把握する必要がありましたので、「GetWindowRect」関数を使用して、ウィンドウの位置とサイズを取得しています。

アクティブウィンドウの取得情報と合体させることで、アクティブウィンドウの位置とサイズを把握することが出来ます。

先ほどの「GetForegroundWindow」で取得したウィンドウハンドルを「GetWindowRect」関数に渡します。

「GetWindowRect」へは初期化した配列を入力します。戻ってきた値を使いやすいようにクラスタへ変更しています。

戻り値のクラスタにした場合、表示される順番は画像のようになっています。

デュアル、トリプルディスプレイの環境でも問題なくウィンドウの位置を特定することが可能です。

関数
ライブラリ名:user32.dll
関数名:GetWindowRect
呼び出し規約:stdcall(WINAPI)

パラメータ
名前:返り値タイプ
タイプ:数値
データタイプ:符号付きポ32ビット整数

パラメータ
名前:hWnd
タイプ:数値
データタイプ:符号なし32ビット整数

パラメータ
名前:RECT
タイプ:配列
データタイプ:符号付き32ビット整数
次元:1
配列形式:配列データポインタ

以上でアクティブウィンドウの位置とサイズを取得することが出来ます。

任意の位置でスクリーンショットを行う

このサンプルプログラムは、連続してスクリーンショットを取得し続けフロントパネルのピクチャ表示器を更新し続けるプログラムです。

ページの説明を見るとWindowsの.NET関数を使用してスクリーンショットを取得しているようです。

マウスカーソルの位置を取得して、カーソルから任意の範囲だけをスクリーンショットし続けます。スクリーンショットの範囲を大きくしすぎると、動作が重たくなるので注意が必要です。

また、高解像度を取得し続けるとメモリリークが起きて、LabVIEWが停止します。サンプルVIではループ無いで連続撮影をするときにリファレンスを閉じていないため、メモリリークが起きているようです。リファレンスを閉じることでメモリリークは押さえられますが、何度もインボークノードを開いたりするので、リファンレンスを毎回閉じていると実行速度が低下します。
特にスピードを要求しないプログラムであれば、リファレンスを閉じた方がメモリリークが起きにくくなるので閉じた方が良いと思います。

「GetWindowRect」関数で取得した値を使用して、任意位置のウィンドウをのスクリーンショットを取得します。

「Sizeのコンストラクタノード」にウィンドウのサイズを入力します。ウィンドウの「上座標と下座標の差」、「左座標と右座標の差」を入力するとスクリーンショット範囲を決められます。

「Graphicsのインボークノード」のCopyfromScreenにどの座標を基点とするかを決めています。ここにウィンドウの「上と左」の座標を入力します。これでスクリーンショットを行う基点を左上に設定することが出来ます。

サンプルのVIだとピクチャ表示器に表示するだけになっているので、「PNGファイルに書き込む」VIを追加することで、画像ファイルとして保存をすることが出来るようになります。

後は、このVIをサブVIとして使用すれば、好きなときにアクティブウィンドウのスクリーンショットを取得することが出来るようになります。