0

我正在开发一个应用程序,即打开一个带有关联应用程序的文件以获取文件扩展名(这部分由 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(for .pdf) 但即使没有 Microsoft Edge 实例正在运行,它也会返回 null,所以我不能等待新创建的进程退出。如果应用程序是微软提供的应用程序,这一切都很好。

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

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

4

1 回答 1

0

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

于 2019-02-16T01:38:19.403 回答