我正在为嵌入式系统编写监视服务,监视某些专有进程并在必要时重新启动它们。 (在您提出问题之前,与恶意软件无关。这只是业务需求)
我需要从我刚创建的进程中检索友好名称,以便稍后我可以使用该名称检索该进程,以便监控其运行状况。
我的问题如下:
如果我尝试在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:重述整个问题以澄清,留下无关紧要的东西。
答案 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);
}