启动后获取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); }