如果应用程序是Microsoft应用程序,则无法等待退出

时间:2019-02-15 22:33:49

标签: c# process waitforexit

我正在开发一个应用程序,即使用关联的应用程序打开文件进行文件扩展(此部分由shellexecute提供),并等待其退出,然后继续在文件上工作。我知道Process.Start(...)可能会返回null,例如,如果存在正在运行的进程,等等。我通过要求用户在继续操作之前关闭默认应用程序的所有窗口来解决此问题。我正在从shell32.dll导入的FindExecutable(...)获取关联的.exe路径,然后在循环中调用它,还检查列表长度是否为0。

var processList = new List<Process>(Process.GetProcessesByName(Path.GetFileNameWithoutExtension(defaultExecutablePath)));

在这里,我遇到了无法克服的墙。如果默认应用是Microsoft(Edge,Photos,Movies)的任何类型的应用,则FindExecutable(...)返回空字符串。 但是Process.Start(...)以某种方式启动了正确的默认应用,例如Microsoft Edge(用于.pdf),但是即使没有Microsoft Edge实例在运行,它也会返回null,因此我不能等待新创建的进程退出。如果应用程序是Microsoft提供的应用程序,那么一切都很好,但有例外。

            var newProcess = Process.Start(openPath);
            if(newProcess == null)
            {
                throw new ProcessStartNullException();
            }else
            {
                newProcess.WaitForExit();
            }

我可以以某种方式利用它或重新设计以等待退出吗?

1 个答案:

答案 0 :(得分:0)

不是因为它们是Microsoft应用,而是因为它们是UWP,并且UWP在名为ApplicationFrameHost的容器进程中运行,因此您需要找出该ApplicationFrameHost下的真实进程,然后对其进行监视。 而且,许多Win 10 UWP应用程序的进程在用户关闭窗口后不会立即终止,因此他们可以进行热启动而不是冷启动以获得更好的性能。它将首先挂起应用程序,然后在需要时终止它。 因此,即使您可以找到真实的进程,也无法始终依靠它来确定UWP窗口是否关闭。