我正在开发一个应用程序,这是打开一个文件与相关的应用程序的文件扩展名(这部分是由shellexecute提供的),等待它退出,然后继续处理文件。我知道Process.Start(...)可能会返回null,例如,如果有相同的进程正在运行,等等。我通过要求用户在继续之前关闭默认应用程序的所有窗口来解决它。我正在从FindExecutable(...)获取关联的.exe路径从shell32.dll导入,然后在循环中调用this,并检查list lenght是否为0。
var processList = new List<Process>(Process.GetProcessesByName(Path.GetFileNameWithoutExtension(defaultExecutablePath)));
在这里,我遇到了一堵我无法克服的墙。如果默认应用程序是微软的任何类型的应用程序(边缘,照片,电影) FindExecutable(...)返回空字符串。但是Process.Start(...)以某种方式启动正确的默认应用程序,例如Microsoft Edge (用于.pdf),但即使没有Microsoft Edge的实例正在运行,它也会返回null,因此我无法等待新创建的进程退出。这一切都很好,但有一个例外,如果应用程序是由微软提供的。
var newProcess = Process.Start(openPath);
if(newProcess == null)
{
throw new ProcessStartNullException();
}else
{
newProcess.WaitForExit();
}
我可以以某种方式利用它或重新设计等待退出吗?
发布于 2019-02-16 09:38:19
这并不是因为它们是微软的ApplicationFrameHost,而是因为它们是UWP,而UWP运行在一个名为ApplicationFrameHost的容器进程中,所以您需要找出该UWP下的实际进程,然后对其进行监控。此外,许多Win 10 UWP应用程序的进程不会在用户关闭窗口后立即终止,因此他们可以有一个热启动,而不是冷启动,以获得更好的性能。它将首先挂起应用程序,然后在需要时终止它。因此,即使您可以找到真实的进程,您也不能总是依靠它来确定UWP窗口是否关闭。
https://stackoverflow.com/questions/54717918
复制相似问题