いくつかの改善があります:
- ファイル名の前に「 \ 」を付ける必要があります
- デフォルトのパラメータを指定する必要はありません
- を使用する場合
ProcessList()
、PID を受け取る 2 番目のパラメーターは常に である必要があり0
ます$window
。ただし、PIDを使用してスクリーン キャプチャ関数を呼び出すことはできません。
- 使用する代わりに、すべてのウィンドウを使用して、表示されているウィンドウをフィルタリング
ProcessList()
する必要がありますWinList()
_ScreenCapture_CaptureWnd(...)
functionの 3 番目と 4 番目のデフォルト パラメータは0
であり、-1
- キャプチャする前に、キャプチャするウィンドウがアクティブであることを確認する必要があります... そうしないと、別のウィンドウの後ろに隠れている可能性があり、最上位のウィンドウの一部のみがキャプチャされます
だからここにあなたの問題に対する実用的な解決策があります:
#include <Array.au3>
#include <ScreenCapture.au3>
Local $var = WinList()
$visibleProcesses = "-1"
For $i = 1 To $var[0][0]
$handle = $var[$i][1]
; Only display visble windows that have a title
If $var[$i][0] <> "" And BitAND(WinGetState($handle), 2) Then
If _ArraySearch(StringSplit($visibleProcesses, "|", 2), $handle) == -1 _
Then
$visibleProcesses &= "|" & $handle
EndIf
EndIf
Next
$visibleProcesses = StringSplit($visibleProcesses, "|", 2)
_ArrayDelete($visibleProcesses, 0)
_ScreenCapture_Capture(@MyDocumentsDir & "\desktop.jpg")
For $handle In $visibleProcesses
_ScreenCapture_CaptureWnd(@MyDocumentsDir & "\process" & $handle & ".jpg", _
HWnd($handle))
Next
これは基本的WinList()
にすべてのプログラムを GUI で受信するために使用します。次に、タイトルがあり、表示されるようにフィルターします ( WinGetState(...)
2 を返す必要があります)。プロセス ハンドルは、デリミタで区切られた文字列がまだ含まれていない場合にのみ追加され、最後にリストが配列に変換され、最初のダミー エントリが削除されます。ダミー エントリがないと、先頭の最初の区切り文字を削除する必要があります。
最後に、関数が適切に呼び出され、ハンドルが配列内の文字列に変換されたため、再度ハンドルに変換する必要があります。
WinActivate(Hwnd($handle))
キャプチャする前にウィンドウをアクティブにするためにキャプチャの前に a を含めたい場合は、最上部から最下部に並べ替えられたリストを返す必要がある_ArrayReverse($visibleProcesses)
ため、最終ループの前にa を追加することを検討してください。WinList()
そして、このリストを後方に反復すると、すべてのウィンドウをアクティブなウィンドウとして設定した後、ウィンドウの順序が保持され、一番下から一番上になります。