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

问题描述 投票:0回答:1

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

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

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

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

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

c# process waitforexit
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.