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

Cannot wait for exit if app is a Microsoft app

我正在开发一个应用程序,它正在打开一个带有文件扩展名的关联应用程序的文件(这部分由 shellexecute 提供),并等待它退出,然后继续处理文件。我知道 Process.Start(...) 可能 return null 例如,如果有一个相同的过程 运行,等等。我通过要求用户关闭所有 windows 来解决它继续之前的默认应用程序。我从 shell32.dll 导入的 FindExecutable(...) 获取关联的 .exe 路径,然后在循环中调用它并检查列表长度是否为 0.

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

在这里我遇到了一堵我无法逾越的墙。如果默认应用程序是来自 Microsoft 的任何类型的应用程序(Edge、照片、电影) FindExecutable(...) returns 空字符串。 然而 Process.Start(...) 以某种方式启动了正确的默认应用程序,例如 Microsoft Edge(对于 .pdf),但它 returns null 即使没有 Microsoft Edge 的实例是 运行 ,所以我等不及新创建的进程退出。如果应用程序是 Microsoft 提供的应用程序,则一切正常,但有一个例外。

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

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

不是因为它们是微软的应用,而是因为它们是UWP,而UWP是运行在一个名为ApplicationFrameHost的容器进程中,所以你需要弄清楚那个ApplicationFrameHost下的真实进程然后监控它。 此外,许多 Win 10 UWP 应用程序的进程不会在用户关闭 window 后立即终止,因此他们可以进行热启动而不是冷启动以获得更好的性能。它会先暂停应用程序,然后在需要时终止它。 所以即使你能找到真正的进程,你也不能总是依靠它来确定 UWP window 是否关闭。