代码之家  ›  专栏  ›  技术社区  ›  WPFNewbie

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

  •  8
  • WPFNewbie  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  7
  •   Enrico Campidoglio    16 年前

    据我所知,Windows窗体和WPF中都没有现成的文件/文件夹浏览器控件。

    或者,你可以主持 Windows窗体WebBrowser控件 在WPF中并使用它浏览文件系统,因为它与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版 本机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>
    
        2
  •  7
  •   EricLaw    15 年前

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

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

    http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will-not-browse-file-system.aspx

        3
  •  2
  •   Grokys    16 年前

    我已经编写了一个开源库,用于在.NET应用程序中嵌入windows资源管理器。你可以看看 http://gong-shell.sourceforge.net/

    它公开了WinForms控件,并为Windows Shell提供了一个.NET语言接口。它是GPL授权的,所以在类似授权的应用程序中使用它是免费的,但是如果你想在商业应用程序中使用它,请给我一封电子邮件,我相信我们可以解决一些问题!

        4
  •  1
  •   Community CDub    7 年前

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

    • 这是一个很大的错误
    • 我一点也不确定它在Vista中的各种安全功能上有多好
    • 我不太了解各种api,所以这是一个非常粗略的草图。。。

    基本方法是:

    1. 启动新的explorer.exe进程
    2. 使用对各种windows api(主要是shell32.dll)的p/invoke调用,将其重新父化为自己的NativeWindow或UserControl。
    3. C++ example ; stackoverflow question WRT调用旧的/默认的WndProc; googling 会产生很多答案。我以前在C#和(ick)VBA中做过这项工作,这将使您能够在非常低的级别上用自己的albiet替换各种UI行为。(这取决于资源管理器的具体实现方式:菜单单击之类的高级操作可以获得它们自己的消息,因此更容易处理;但是资源管理器行为的其他方面您可能只获得原始的鼠标消息。)

    Spy++ 以便找出什么时候发生的消息。

    是的,这是构建许多非常丑陋和脆弱代码的好方法,但它(a)有时是使事情正常工作的唯一方法;以及(b)对于学习Windows.Forms/MFC/etc下发生的事情非常有用。