启动后获取Process的友好名称

时间:2013-01-22 22:10:07

标签: c# .net process

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

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

我的问题如下:

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

  • 如果我使用Process.WaitForInputIdle()会发生同样的情况,但由于这需要一个消息泵,并且许多可执行文件可能是实际应用程序的无UI启动器,因此这可能不是一个选项。

  • 需要在创建流程之后立即获取友好名称,然后再做其他事情。

以下是代码段:

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

例如,如果正在启动的进程是Firefox,则会在最后一行抛出InvalidOperationException

那我该怎么办呢?有更安全的方法吗?

编辑:添加了一个代码段以便澄清。 编辑2:重述整个问题以澄清,留下无关紧要的东西。

2 个答案:

答案 0 :(得分: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);

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

感谢您的所有评论!

答案 1 :(得分: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);
}