我正在测试一个简单的Windows服务,它检测应用程序是否响应,并将结果写入文件。
在调试期间一切正常但是一旦我发布服务它就不会检测到挂起的应用程序?它仍然写入文件没有问题但由于某种原因响应检查没有触发。好像我忽略了什么?
//开始方法
protected override void OnStart(string[] args)
{
var worker = new Thread(DoWork);
worker.Name = "MyWorker";
worker.IsBackground = false;
worker.Start();
}
//工作
void DoWork()
{
string curFile = AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt";
Process[] runningProcs = Process.GetProcessesByName("TestApp");
if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt"))
{
File.Delete(curFile);
}
while (runningProcs.Length > 0)
{
System.Threading.Thread.Sleep(2500);
foreach (Process checkProc in runningProcs)
{
if (checkProc.Responding)
{
File.AppendAllText(curFile, "Application is Responding @ " + DateTime.Now + System.Environment.NewLine);
}
else
{
File.AppendAllText(curFile, "Application is Not Responding @ " + DateTime.Now + System.Environment.NewLine);
}
}
}
}
调试输出:
申请正在回应@ 1/15/2014 8:59:40 AM
申请正在回应@ 1/15/2014 8:59:43 AM
应用程序正在响应@ 1/15/2014 8:59:45 AM
应用程序没有响应@ 1/15/2014 8:59:53 AM
应用程序没有响应@ 1/15/2014 8:59:55 AM
应用程序无响应@ 1/15/2014 8:59:58 AM
服务输出:
申请表正在回复@ 1/15/2014 9:03:02 AM
申请表正在回应@ 1/15/2014 9:03:05 AM
申请表正在回应@ 1/15/2014 9:03:07 AM
申请表正在回应@ 1/15/2014 9:03:10 AM
申请正在回应@ 1/15/2014 9:03:12 AM
答案 0 :(得分:1)
根据属性的文档,Process.Responding获取一个值,指示进程的用户界面是否响应。我希望在封面下,调用EnumWindows()或EnumThreadWindows()来查找与进程关联的窗口,然后在每个窗口上调用SendMessageTimeout()以查看是否有响应。
不幸的是,这给您的Windows服务带来了问题,由于Session 0 Isolation,该服务未在与您要检查的进程相同的会话中运行。服务对EnumWindows()的调用只会返回会话0中的窗口,这些窗口都不会用于在会话1或更高版本中运行的应用程序。并且找不到窗口就足以响应返回'true',因为它不会更好。
调试时工作正常,因为您的应用程序和GUI在同一会话中运行,EnumWindows()按预期找到窗口。