我正在开发一个应用程序,即打开一个带有关联应用程序的文件以获取文件扩展名(这部分由 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();
}
我可以以某种方式利用它或重新设计等待退出吗?