启动后获取Process的友好名称

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

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

我的问题如下:

  • 如果我尝试在Process.Start()之后立即读取Process.ProcessName ,则会收到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

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

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

好吧,经过大量的研究后,我不得不求助于一个有点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); 

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

非常感谢您的所有评论!

你错过了代码中的一些关键内容,并尝试使用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); }