我有一个程序正在打开一个浏览器窗口到某个文件夹,但我想在浏览器窗口关闭后立即执行操作,但如果我使用以下代码:
Process proc = Process.Start("explorer.exe", "D:\\");
proc.WaitForExit();
它正在根据需要打开资源管理器窗口,但WaitForExit命令没有任何效果,它只是直接通过它。
是否有不同的方式打开资源管理器窗口,当用户关闭时,该窗口可以让我知道?
答案 0 :(得分:7)
问题在The Old New Thing很好地解释了:
WaitForSingleObject立即返回的原因是Explorer是一个单实例程序(好的,有限实例)。当您打开资源管理器窗口时,请求将被移交给正在运行的资源管理器副本,并且您启动的资源管理器副本将退出。这就是你的WaitForSingleObject立即返回的原因。
他提供了一些你可能会使用的解决方案(大量使用PInvoke),比如使用像this这样的东西。
最后,您可能更容易使用其他类型的文件浏览器,可能来自您可以更好地控制的C#库,而不是资源管理器。
答案 1 :(得分:3)
无法重新生成错误。试过这个:
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"
您需要重新启动计算机才能生效。