打开资源管理器窗口并等待它关闭

Posted

技术标签:

【中文标题】打开资源管理器窗口并等待它关闭【英文标题】:Open explorer window and wait for it to close 【发布时间】:2021-12-17 07:47:27 【问题描述】:

我有一个程序正在打开某个文件夹的资源管理器窗口,但我想在资源管理器窗口关闭后立即执行操作,但如果我使用以下代码:

Process proc = Process.Start("explorer.exe", "D:\\");
proc.WaitForExit();

它正在根据需要打开资源管理器窗口,但 WaitForExit 命令没有任何效果,它只是通过它。

是否有其他打开浏览器窗口的方式可以让我知道它何时被用户关闭?

【问题讨论】:

问题是所有窗口和主桌面都有一个 explorer.exe。不知道如何修复它,但也许您可以枚举窗口并找到正确的标题,然后等待该窗口关闭?不过很容易出错。 看到这个线程from msdn。如果您将 explorer 作为 shell 运行,您似乎不能。 我可以告诉你,等待退出部分不起作用,因为它并没有真正开始一个新进程。某处有“在新进程中打开窗口”的设置,或者曾经有。祝你好运。 【参考方案1】:

The Old New Thing 很好地解释了这个问题:

WaitForSingleObject 立即返回的原因是 Explorer 是一个单实例程序(嗯,有限实例)。当您打开资源管理器窗口时,请求将移交给资源管理器的运行副本,并且您启动的资源管理器副本退出。这就是您的 WaitForSingleObject 立即返回的原因。

他提供了一些您可能会使用的解决方案(大量使用 PInvoke),例如使用 this 之类的东西。

最后,您可能更容易使用其他类型的文件浏览器,可能来自您可以更多控制的 C# 库,而不是资源管理器。

【讨论】:

+1 真正的问题是您需要使用一个设计为在您的控制之下的组件,而不是试图搭载系统范围的 shell 进程。【参考方案2】:

无法重新生成错误。刚试过这个:

Process.Start("explorer.exe", "D:\\").WaitForExit();

它会阻塞当前线程并等到我关闭资源管理器窗口。确保您没有在另一个线程上执行命令,而不是您要阻止的线程。还要确保通过导入下面的 .reg 文件将窗口的每个实例设置为启动 explorer.exe 的新实例:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
"DesktopProcess"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer]
"DesktopProcess"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BrowseNewProcess]
"BrowseNewProcess"="Yes"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\BrowseNewProcess]
"BrowseNewProcess"="Yes"

您需要重新启动计算机才能生效。

【讨论】:

注册表更改成功了。非常感谢您提供的信息并花时间帮助我! 这个解决方案听起来对系统来说成本很高。

以上是关于打开资源管理器窗口并等待它关闭的主要内容,如果未能解决你的问题,请参考以下文章

cocos creator资源管理器小窗怎么还原

使用MSBuild / Web Deployment Project启动程序而不是等待它

android studio 4 sdk管理器窗口没有打开,文件->设置窗口也没有打开

启动 Windows 资源管理器并突出显示文件

使用 Process.Start 打开资源管理器窗口会创建过多的 explorer.exe 进程

选择文件打开 Windows 资源管理器(或焦点,如果存在)的代码