有一些改进:
- 你必须在你的文件名前加上一个“ \ ”
- 您不需要指定默认参数
- 当您使用
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()
应该返回一个从最顶部到最底部排序的列表。并且在将每个单独的窗口设置为活动窗口之后,向后遍历此列表将保留窗口的顺序,从而从最底部开始。