c#Process.Start()没有返回正确的响应

时间:2018-09-01 09:09:47

标签: c# process process.start

我正在开发一个程序,用户可以在该程序中启动任何应用程序。该程序将存储已启动的应用程序的进程ID,因此可以在用户需要时终止它。

Process application = new Process();
application.StartInfo.FileName = txtApplicationToOpen.Text;

if (application.Start())
{
    Debug.WriteLine("started");
    lstCurrentlyOpenApplications.Items.Add(txtApplicationToOpen.Text);
    _openApplications.Add(application);
}

我面临的问题:

if(application.Start())中的部分仅在我打开说exe文件或excel文件时被调用(尽管excel文件返回的PID不会杀死excel程序)。

当我打开mp3,mp4或图像文件时,它没有输入if语句

当尝试获取进程的ID时,它返回以下错误

  

System.InvalidOperationException:没有与此对象相关联的进程。

2 个答案:

答案 0 :(得分:1)

您必须使用ProcessStartInfo.UseShellExecute才能“执行”文档(并让Windows查找与给定文件关联的程序)。在那里查看其他答案:ShellExecute vs. Process.Start

如果没有该标志,则只能启动exe文件。

答案 1 :(得分:0)

what Process.Start returns的说明中说:

  

如果启动了流程资源,则为true;否则为false。如果没有启动新的流程资源(例如,如果现有流程被重用),则为false。

因此,如果您启动EXE,则预期调用Start将返回true(假设EXE存在)。对于您不给它EXE的情况,发生的情况将变得有些不可预测。核心原因是因为外壳正在处理您的Start。如果您使用application.StartInfo.UseShellExecute = false;重新运行测试,将会得到截然不同的结果。原来,UseShellExecute为假时,您只能启动EXE(或COM文件)。

关键部分是,仅在启动 new 流程资源时,Start才返回true。在测试中,我发现如果是第一次启动.xlsx文件,则会创建一个新的Excel进程(实际上,它成为一个子进程)。这使得Start()返回true。对于每个下一个.xlsx文件,现有过程将被重复使用,因此不会创建 new 过程,因此Start返回false。

启动.mp4文件时,情况也是如此。在我的盒子上,该扩展名仍与默认的Windows Movie Player关联。这只会在已经运行的svchost服务下创建一个子进程。这可能会使false返回。

如果我使用与VLC播放器Start相关联的扩展名,则为我提供的每个新文件返回true,但是从外观上看,VLC播放器将其工作移交给了正在运行的实例,然后关闭新启动的进程。

process.Start返回正确的结果。它返回的内容取决于开始的内容以及其注册处理程序的选择方式。基于此,您可能会或可能不会找到正在启动的新进程。值得注意的是,用户可以控制与某个扩展名关联的内容,以及对以某个扩展名启动文件的操作。

这是使用几种文件类型进行一些实验之后我的过程树的样子:

enter image description here

对于那些我有一个process.Id仍然有效。