我正在为嵌入式系统编写看门狗服务,该进程监视某些专有进程并在必要时重新启动它们。 (没有做恶意软件,我可以告诉大家,这只是一个业务需求)在启动后为进程获取友好名称
我需要从我刚刚创建过程检索友好的名字,这样以后我可以检索使用,这一进程名称,以监测其健康状况。
我的问题是:
如果我尝试
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;
这将在最后一行抛出InvalidOperationException
如果正在启动过程中是火狐,例如。
那么我该怎么做呢?有没有更安全的方法?
编辑:添加了一个代码片段澄清。编辑2:改写整个问题的澄清,留下无关紧要的东西。
受监视的进程是否启动消息泵?如果不是,'WaitForInputIdle'根本不会做任何事情。也许你可以使用Process.MainModule来找到可执行文件的名字? – Jon
想到了,是的。但在我的测试案例中,这个过程就是Firefox。 –
你的意思是'Process.MainModule.ModuleName'?它总是返回与“Process.ProcessName”相同的值吗? –