【问题标题】:autoit window screen shot sucess/fail自动窗口屏幕截图成功/失败
【发布时间】:2013-08-22 09:28:48
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    有一些改进:

    • 您必须在文件名前添加“\”
    • 您无需指定默认参数
    • 当您使用ProcessList() 时,接收PID 的第二个参数应始终为0,而不是$window。但是您不能使用 PID 来调用截屏函数!
    • 您应该只使用WinList() 并过滤所有可见窗口,而不是使用ProcessList()
    • _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() 应该返回一个正在排序的列表从上到下。在将每个单独的窗口设置为活动窗口之后,向后遍历此列表将保留窗口的顺序,从而从最底部开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多