2013-08-20 298 views
2

我的目標是從桌面和所有正在使用的進程製作GUI循環打印屏幕。我現在唯一的問題是:某些進程沒有任何可見的接口(例如OS進程)。autoit窗口屏幕截圖成功/失敗

我使用這些命令來捕捉屏幕:

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

但正如我所說,有沒有一個接口,它會返回在_ScreenCapture命令程序失敗。有沒有辦法知道一個進程是否有用戶界面?

回答

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)),使窗口成爲活動之一,它被捕獲之前,你可能會考慮最終環路WinList()前添加_ArrayReverse($visibleProcesses)應該返回一個列表,從頂部的最頂層,以進行排序最底層。在將每個窗口設置爲活動窗口之後,向後遍歷該列表將保持窗口的順序 - 從而成爲最頂層 - 從最底層開始。