如何关闭使用Process.Start()创建的窗口

时间:2013-08-01 12:20:17

标签: .net winapi process

我从我的应用程序中打开文件资源管理器窗口。我是按照以下方式做的:

var si = new ProcessStartInfo("explorer.exe", Path);
si.UseShellExecute = true;
var p = Process.Start(si);
p.WaitForInputIdle();
_hwnd = Window.FindWindow("CabinetWClass", null);

那部分有效。现在,p.HasExited已经是真的了。我不知道为什么会这样,但我认为文件浏览器不是一个普通的过程。

无论如何,我尝试了p.Close()p.CloseMainWindow()p.Kill()并且没有任何效果

我还导入了DestroyWindow:

[DllImport("user32.dll", SetLastError = true)]
public static extern bool DestroyWindow(IntPtr hWnd);

并像这样使用它:

var result = Window.DestroyWindow(_hwnd);

但这也没有效果(_hwnd是一个正确的非零句柄)......

如何关闭此窗口?

1 个答案:

答案 0 :(得分:1)

意外地销毁其他进程资源会导致不可预测的行为......此外,您依赖于窗口类等详细信息。非常不稳定的代码,我希望我永远不会把这个产品放到我的机器上。

无论如何,您可以使用COM使用可靠且文档化的API“引导”Windows资源管理器。我对这种技术非常生疏,但我可以指出你正确的方向:http://www.codeproject.com/Articles/12029/Automate-the-Active-Windows-Explorer-or-Internet-E(这篇文章是关于IE和Windows资源管理器的,因为它们共享许多共同的基础设施)。

.NET也可以使用COM API。代码有时看起来更好。