【问题标题】:How to get files selected in Explorer如何在资源管理器中选择文件
【发布时间】:2015-06-22 21:28:02
【问题描述】:

我必须编辑在 Visual Studio 中以 vb.net 语言编写的加载项。我需要的是一种从活动 Windows 资源管理器窗口中获取所有当前选定文件列表的方法,以便我可以将其传递给程序中的另一个函数。我在 Visual Studio 方面不是很有经验(我的大部分经验都是在使用 VB 6.0 的 VBA 中),所以在我花太多时间走错路之前,我正在寻找一些建议。

我正在考虑使用 Windows Shell 对象。我发现了一些用 C++ 编写的示例,并且我花了一些时间阅读 MSDN,但在我投入大量时间之前,我想在这里接触更有经验的 VB.Net/VS 用户。我知道 .Net 有很多用于处理 system.io 命名空间下的文件/文件夹对象的内置选项,但我还没有找到任何可以让我查看资源管理器窗口中当前选定项目的内容。

我只是想知道 .Net 中是否有可以满足我需要的原生功能?
如果不是,使用 Windows Shell 对象是最好的方法吗?

【问题讨论】:

  • @Piters 这是我在搜索该站点时发现的示例之一,它引导我使用 Windows Shell 对象。你是说这绝对是推荐的方式吗?我只是没有找到很多 VB 特定的东西,所以不确定人们在 VB.Net 和其他语言中是否有另一种方法。

标签: .net vb.net windows-shell


【解决方案1】:

这只是this answer 的一个小版本。与其像链接的答案那样处理重点项目,不如从ShellFolderView 获取选定的项目。 System.IO 不会对你有多大好处,因为文件/文件夹相关的类与文件系统有关——文件不知道资源管理器是否选择了它们。

首先,添加对Microsoft Shell Controls and AutomationMicrosoft Internet Controls 的引用(参见上面的链接)。

Imports Shell32
Imports SHDocVw

Private Function GetExplorerSelectedFiles() As String()
    Dim ExplorerFiles As New List(Of String)

    Dim exShell As New Shell


    For Each window As ShellBrowserWindow In DirectCast(exShell.Windows, IShellWindows)
        ' check both for either interface to work
        '    add an Exit for to just work the first explorer window 
        If TryCast(window.Document, IShellFolderViewDual) IsNot Nothing Then
            For Each fi As FolderItem In DirectCast(window.Document, IShellFolderViewDual).SelectedItems
                ExplorerFiles.Add(fi.Path)
            Next

        ElseIf TryCast(window.Document, ShellFolderView) IsNot Nothing Then
            For Each fi As FolderItem In DirectCast(window.Document, ShellFolderView).SelectedItems
                ExplorerFiles.Add(fi.Path)
            Next

        End If
    Next

    Return ExplorerFiles.ToArray
End Function

用法(在按钮单击中):

Dim files = GetExplorerSelectedFiles()
lbFiles.Items.AddRange(files)


修改为在 IShellFolderViewDualShellFolderView 上工作

【讨论】:

  • 我还没有机会测试您的代码,但乍一看它似乎会从所有资源管理器窗口中获取所有选定的文件,无论该窗口是否处于活动状态。我认为我们需要从链接的答案中保留If SFV.FocusedItem IsNot Nothing Then,不是吗?
  • 它可以正常工作,但会从资源管理器中获取所有选定的文件(只有一个资源管理器实例,但可以有多个资源管理器窗口/视图)。 “活动”资源管理器窗口是暂时的 - 如果您的应用具有输入焦点,则没有活动的资源管理器窗口。您可能需要一个初步步骤来选择一个窗口。
  • 这是一个“windows 窗体应用程序”项目,所以我想我可以在启动事件(在表单加载之前)创建一个字符串变量,并在应用程序之前从活动窗口中获取选定的文件集中注意力。
  • 这很脆弱 - 您无法保证资源管理器查看器在启动时将成为活动窗口。向用户提供您找到的所有选定文件并让他们选择哪些文件可能会更好;或向他们提供所有可供选择的资源管理器路径的列表(例如long path name... (3 files)path name 2... (17 files),甚至省略没有选定文件的路径
  • 应用程序的启动方式是从windows explorer。用户选择一个文件(或多个文件)并右键单击所选文件并选择启动应用程序。因此,除非资源管理器是活动窗口并且至少选择了一个文件,否则它将永远不会启动。我想捕捉他们在选择启动应用程序时选择的内容,我不想显示任何其他表单或要求他们重新选择文件。
猜你喜欢
  • 2021-07-26
  • 2011-09-07
  • 2011-05-24
  • 1970-01-01
  • 2010-09-24
  • 2023-03-13
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多