2

私の目標は、デスクトップからの印刷画面と使用されているすべてのプロセスをループする GUI を作成することです。私が現在抱えている唯一の問題は次のとおりです。一部のプロセスには表示可能なインターフェイスがありません (たとえば、OS プロセス)。

これらのコマンドを使用して画面をキャプチャしています。

_ScreenCapture_Capture(@MyDocumentsDir & "desktop.jpg")
_ScreenCapture_CaptureWnd(@MyDocumentsDir & "process.jpg", _
                          $processes[$window], -1, -1, -1, -1, True)

しかし、私が言ったように、_ScreenCapture コマンドで失敗を返すインターフェイスのないプログラムがあります。プロセスにユーザー インターフェイスがあるかどうかを知る方法はありますか?

4

1 に答える 1

3

いくつかの改善があります:

  • ファイル名の前に「 \ 」を付ける必要があります
  • デフォルトのパラメータを指定する必要はありません
  • を使用する場合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()そして、このリストを後方に反復すると、すべてのウィンドウをアクティブなウィンドウとして設定した後、ウィンドウの順序が保持され、一番下から一番上になります。

于 2013-08-21T06:29:31.567 に答える