【问题标题】:Cannot wait for exit if app is a Microsoft app如果应用程序是 Microsoft 应用程序,则无法等待退出
【发布时间】:2019-02-15 22:33:48
【问题描述】:

我正在开发一个应用程序,即打开一个带有关联应用程序以获取文件扩展名的文件(这部分由 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,所以我不能等待新创建的进程退出。如果应用程序是 Microsoft 提供的应用程序,这一切都很好。

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

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

【问题讨论】:

    标签: c# process waitforexit


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多