2011-07-15 49 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