2

我的目标是制作一个从桌面和所有正在使用的进程循环打印屏幕的 GUI。我现在唯一遇到的问题是:某些进程没有任何可视界面(例如操作系统进程)。

我正在使用这些命令来捕获屏幕:

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

但正如我所说,有些程序没有接口会在 _ScreenCapture 命令中返回失败。有没有办法知道进程是否有用户界面?

4

1 回答 1

3

有一些改进:

  • 你必须在你的文件名前加上一个“ \ ”
  • 您不需要指定默认参数
  • 当您使用ProcessList()时,接收 PID 的第二个参数应该始终是0,而不是$window。但是你不能使用 PID来调用屏幕截图功能!
  • 而不是使用ProcessList()你应该只使用WinList()和过滤所有可见的窗口
  • 函数的第三个和第四个默认参数_ScreenCapture_CaptureWnd(...)0, not-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 回答