在我的 WPF 应用程序中托管 Windows Shell 资源管理器

问题描述 投票:0回答:4

是否可以在 WPF 或 WinForms 窗口中嵌入 Windows 资源管理器文件/文件夹浏览器视图?

我基本上想将文件/文件夹浏览器托管为我的应用程序窗口的一部分。我不想重新实现 shell 提供的功能,尤其是像 TortoiseSVN 这样的 shell 扩展。

wpf winforms controls
4个回答
7
投票

据我所知,Windows 窗体和 WPF 中都没有任何现成的文件/文件夹浏览器控件。
然而,有一些商业第三方控件提供类似 Windows 资源管理器的界面来浏览磁盘上的文件和文件夹。看看 LogicNP 的这些产品:

或者,您可以在 WPF 中托管 Windows Forms WebBrowser 控件,并使用它来浏览文件系统,因为它与 Windows shell 集成。
在 XAML 中你可以做这样的事情:

<Window x:Class="Samples.FilesystemBrowser"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    Title="Filesystem Browser">
    <StackPanel>
        <WindowsFormsHost>
            <wf:WebBrowser Url="C:\" />
        </WindowsFormsHost>
    </StackPanel>
</Window>

请注意,在 .NET 3.5 SP1 中,Microsoft 添加了本机 WPF WebBrowser 控件,因此您可以选择使用它:

<Window x:Class="Samples.FilesystemBrowser"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Filesystem Browser">
    <StackPanel>
        <WebBrowser Source="C:\" />
    </StackPanel>
</Window>

7
投票

Windows Vista的Shell引入了一个新的控件,它实现了IExplorerBrowser接口;这是在应用程序中托管 Windows Shell 文件系统视图的推荐方法。使用 .NET 构建应用程序的开发人员可以使用 Windows API CodePack for .NET 中提供的 ExplorerBrowser 控件的包装版本。

请注意,此界面仅在 Windows Vista 及更高版本上可用。如果您的应用程序需要在早期的 Windows 版本上运行,您将需要回退到这些平台上的旧 WebOC 实现。

http://msdn.microsoft.com/en-us/library/bb761909(VS.85).aspx http://code.msdn.microsoft.com/WindowsAPICodePack

由于此处描述的 Win7 问题,建议使用此方法来替代托管 Web 浏览器控件:http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will -不浏览文件系统.aspx


2
投票

我的答案中的方法并不是我一定会推荐的方法,因为它基本上是一个巨大的黑客攻击。然而,几乎可以在另一个应用程序中“托管”任何 Windows 应用程序。注意事项:

  • 这是一个大黑客
  • 我完全不确定它与各种安全功能的配合情况如何,例如在维斯塔
  • 您将一直使用低级且有时文档记录不足的 API,并做一些与原始设计者预期不同的事情。
  • 我不太了解各种 API,无法准确地告诉您该怎么做,所以这是一个非常粗略的草图...

基本方法是:

  1. 启动新的explorer.exe进程
  2. 获取其HWnd
  3. 使用 p/invoke 调用各种 Windows API(主要是 shell32.dll),将其重新设置为您自己的 NativeWindow 或 UserControl。
  4. 然后,您可以将其 WndProc 消息处理程序替换为您自己的消息处理程序,对其进行子类化以注入您自己的应用程序特定行为。 (
  5. C++ 示例stackoverflow 问题 WRT 调用旧/默认 WndProc;谷歌搜索 将产生很多答案。我之前在 C# 和(恶心)VBA 中做过此操作)这将让您替换各种 UI 行为与你自己的,尽管处于非常低的水平。 (这取决于资源管理器的具体实现方式:菜单单击等更高级别的操作可以获取自己的消息,因此更容易处理;但是资源管理器行为的其他方面,您可能只能获取原始鼠标消息。)
您需要

Spy++ 才能弄清楚何时发生什么消息。

是的,这是构建大量非常丑陋且脆弱的代码的好方法,但它(a)有时是让事情正常工作的唯一方法; (b) 非常适合了解 Windows.Forms / MFC / 等底层的情况。


2
投票
我编写了一个开源库,用于在 .NET 应用程序中嵌入 Windows 资源管理器。你可以看看

http://gong-shell.sourceforge.net/

它公开 WinForms 控件,并为 Windows Shell 提供 .NET 语言接口。它根据 GPL 获得许可,因此在类似许可的应用程序中使用它是免费的,但是如果您想在商业应用程序中使用它,请给我发送电子邮件,我相信我们可以解决问题!

© www.soinside.com 2019 - 2024. All rights reserved.