2011-07-15 90 views
7

我正試圖使用​​C#/ .NET 4.0自動化外部應用程序的GUI。確定應用程序是否被阻止/忙碌?

正在自動化(AUT)的應用程序是一個VB6應用程序。

在做一個動作,或者點擊一個按鈕時,AUT有時會花費大量的時間等待DB迴應。當應用程序正在等待數據庫結果時,應用程序本身是空閒的(不會註冊太多CPU使用率),但它被阻止(您不能單擊或與其交互)。

- 所以到目前爲止,我試圖看着鼠標指針(沙漏)作爲指標,但有時該應用被堵塞,但光標是正常的。所以這是不可靠的。我試過看過AUT的TotalProcessorTime(這個措施,如果應用程序是IDLE或BUSY)的主要過程,但正如我所說,有時應用程序是IDLE,仍然被阻止。

所以我想磁帶到計算器人羣的經驗,看是否有人已經知道如何處理,以及/或者如果你有關於如何實現這一目標的任何想法。

感謝

編輯:

我一直在玩弄,只是發現了一些。

雖然AUT被阻塞,它沒有響應鍵盤或鼠標輸入。但是,如果我將WM_LBUTTONCLICK消息發送到窗口,我可以確認消息正在處理(以及UI更改)。

所以我猜他們是有意阻止應用程序,同時使DB調用。

+0

UI是否被禁用?主UI線程是否在工作線程上阻塞?如果您嘗試與應用程序交互,您是否看到窗口重影? –

+0

您無法與主用戶界面進行交互,但是我不認爲主用戶界面線程被阻止,因爲您嘗試與其交互時看不到任何「重影」。它只是沒有做任何事情。所有的控件/ UI仍然「啓用」。 – DanyO

+0

使用Spy ++檢查主窗口是否被禁用。如果消息隊列正在被抽取,並且您無法調用UI操作,那麼我猜測,AUT中的某些內容必須被禁用。 –

回答

3

您可以檢查應用程序的UI是否被響應:

獲取流程實例該應用程序並檢查其Responding屬性。像:

//To get the process instance 
Process application = null; 
foreach (var process in Process.GetProcesses()) 
{ 
    if (process.ProcessName == "The Process Name") 
    { 
     application = process; 
     break; 
    } 
} 

//to check if the process UI is not responding 
if (application.Responding) 
{ 
    // 
} 

編輯:您可修改application.Responding檢查this使用的超時。

+0

我剛剛驗證過,並且在應用程序似乎被阻止的地方,application.Responding返回TRUE,所以我們不能使用它... – DanyO

+0

@ DanyO:可能你的進程沒有'MainWindowHandle',[msdn](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx)'如果進程沒有一個MainWindowHandle,此屬性返回true.',否則此屬性應該工作 「AFAIK」,例如:檢查[此](http://msdn.microsoft.com/en-us/library/aykwfbdh(v = vs.71) .aspx) –

+0

我剛剛證實,並且該進程確實有一個有效的MainWindowHandle。從文檔中,不「Process.Responding」僅適用於被認爲掛起的應用程序?我正在測試的應用程序實際上並未掛起,直到它從數據庫收到響應才被阻止。 – DanyO