我的目标是从桌面和正在使用的所有进程制作GUI循环打印屏幕。我现在唯一的问题是:某些进程没有任何可查看的接口(例如OS进程)。
我正在使用这些命令捕获屏幕:
_ScreenCapture_Capture(@MyDocumentsDir & "desktop.jpg")
_ScreenCapture_CaptureWnd(@MyDocumentsDir & "process.jpg", _
$processes[$window], -1, -1, -1, -1, True)
但正如我所说,有些没有接口的程序会在_ScreenCapture命令中返回失败。有没有办法知道进程是否有用户界面?
答案 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()
应返回从最顶部到最底部排序的列表。向后遍历此列表将在将每一个窗口设置为活动窗口之后保持窗口的顺序 - 从而成为最顶层 - 从最底层开始。