2

我正在为嵌入式系统编写监视程序服务,该系统监视一些专有进程并在必要时重新启动它们。(在您问之前,与恶意软件无关。这只是业务需求)

我需要从刚刚创建的进程中检索友好名称,以便稍后我可以使用该名称检索该进程以监控其运行状况。

我的问题如下:

  • 如果我尝试在Process.ProcessName之后立即阅读Process.Start(),我会得到一个,InvalidOperationException因为该过程尚未完全创建。

  • 如果使用Process.WaitForInputIdle().

  • 需要在创建流程后立即获取友好名称,然后再执行其他任何操作。

这是一个代码片段:

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForInputIdle();
var friendlyName = process.ProcessName;

InvalidOperationException例如,如果正在启动的进程是 Firefox,这将在最后一行抛出一个。

那么我该怎么做呢?有没有更安全的方法?

编辑:添加了一个代码片段以进行澄清。EDIT2:重新表述了整个问题以进行澄清,留下了不相关的东西。

4

2 回答 2

4

好的,所以经过大量研究后,我不得不求助于一个有点 hacky 的解决方案。

根据Process.GetProcessesByName()文档,“进程名称是进程的友好名称,例如 Outlook,不包括 .exe 扩展名或路径。 ”。

考虑到这一点,我使用以下代码解决了这个问题:

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.Start();
var friendlyName = Path.GetFileNameWithoutExtension(startInfo.FileName);

正如我所说,它仍然感觉有点老套,但至少它完成了工作并让我继续前进。

无论如何,感谢您的所有评论!

于 2013-01-23T15:32:37.763 回答
0

你在你的代码中遗漏了一些关键的东西并尝试使用这样的东西NotePad.exe,你会看到我在说什么

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.Start();
process.WaitForInputIdle();
// this line below will always be false because `process.ProcessName will be 
//notepad and process.StartInfo.FileName = notepade.exe 
if (process.ProcessName.Equals(process.StartInfo.FileName) == false)
{
   var theConfiguredProcessName = process.ProcessName;
}

另一个选项你可以做下面两件事中的任何一件

Process[] processName = Process.GetProcessesByName("blah.exe");

或检查所有正在运行的进程并检查您正在运行的进程

Process[] processlist = Process.GetProcesses();
foreach(Process process in processlist)
{
   Console.WriteLine("Process: {0} ID: {1}", process.ProcessName, process.Id);
}
于 2013-01-22T22:58:18.503 回答