【问题标题】:How to close window created with Process.Start()如何关闭使用 Process.Start() 创建的窗口
【发布时间】:2013-08-01 12:20:17
【问题描述】:

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

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 是一个正确的非零句柄)...

如何关闭此窗口?

【问题讨论】:

    标签: .net winapi process


    【解决方案1】:

    意外破坏其他进程资源会导致不可预知的行为...此外,您还依赖于此处的窗口类等细节。非常不稳定的代码,我希望我永远不会把这个产品放到我的机器上。

    无论如何,您都可以使用 COM 使用可靠且记录在案的 API 来“控制”Windows Explorer。我对这种技术非常生疏,但我可以为您指明正确的方向:http://www.codeproject.com/Articles/12029/Automate-the-Active-Windows-Explorer-or-Internet-E(这篇文章是关于 IE 和 Windows Explorer,因为它们共享许多共同的基础架构)。

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

    【讨论】:

    • 谢谢,我会调查的。我想要实现的是将文件资源管理器嵌入到我的应用程序中并从中删除一些菜单/按钮......别担心,你不会在你的机器上得到这个产品......它只是为了测试。
    • 我确信 explorer 的各个部分都可以以官方方式托管。想想文件保存对话框——它承载了一个 Windows 资源管理器并支持所有常见的拖放以及 shell 扩展。
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多