自动窗口屏幕截图成功/失败

时间:2013-08-20 10:52:43

标签: user-interface process screen autoit screen-capture

我的目标是从桌面和正在使用的所有进程制作GUI循环打印屏幕。我现在唯一的问题是:某些进程没有任何可查看的接口(例如OS进程)。

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

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

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

1 个答案:

答案 0 :(得分:3)

有一些改进:

  • 您必须在文件名
  • 之前添加“ \
  • 您无需指定默认参数
  • 使用ProcessList()时,接收PID的第二个参数应始终为0,而不是$window。但是你无法使用PID 来调用屏幕捕获功能!
  • 您应该使用ProcessList()而不是使用WinList(),而是过滤所有可见的窗口
  • _ScreenCapture_CaptureWnd(...)功能的第三和第四默认参数为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))以使窗口成为活动窗口之前的活动窗口,您可以考虑在最终循环之前添加_ArrayReverse($visibleProcesses) WinList()应返回从最顶部到最底部排序的列表。向后遍历此列表将在将每一个窗口设置为活动窗口之后保持窗口的顺序 - 从而成为最顶层 - 从最底层开始。