在C#中打开的资源管理器窗口中获取文件/目录列表

时间:2014-10-23 18:50:23

标签: c# winapi windows-shell

我正在尝试拉出打开的资源管理器窗口中列出的文件和目录列表(按照它们显示的顺序),以便我可以查看它,然后将焦点设置为特定项目。 / p>

我发现此代码here允许我获取选中的项,但我不确定是否可以使用此方法来获取所有 >项目:

List<string> SelectedFiles() {
    string filename;
    List<string> selected = new List<string>();
    var shell = new Shell32.Shell();
    foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows()) {
        filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
        if (filename.ToLowerInvariant() == "explorer") {
             ((Shell32.IShellFolderViewDual2)window.Document).SelectItem()
            foreach (Shell32.FolderItem item in items) {
                selected.Add(item.Path);
            }
        }
    }
    return selected;
}

看起来这个Shell32方法也允许我以编程方式选择一个项目,这是我想要完成的另一个部分。我会调用SelectedItems()而不是SelectItem(),但我不确定如何使用该功能。

任何人都知道从打开的Windows资源管理器窗口获取文件/目录列表的方法(理想情况下将焦点设置为项目)?也许是P / Invoke那种东西?

1 个答案:

答案 0 :(得分:2)

我能够修改我发现的代码片段,列出所有文件/目录,而不仅仅是所选文件/目录。

这是我最终的结果:

    List<string> FilesAndFolders() {
        string filename;
        List<string> explorerItems = new List<string>();
        var shell = new Shell32.Shell();
        foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows()) {
            filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
            if (filename.ToLowerInvariant() == "explorer") {
                Shell32.Folder folder = ((Shell32.IShellFolderViewDual2)window.Document).Folder;
                Shell32.FolderItems items = folder.Items();
                foreach (Shell32.FolderItem item in items) {
                    explorerItems.Add(item.Path);
                }
            }
        }
        return explorerItems;
    }

编辑:

要选择项目,请致电:

((Shell32.IShellFolderViewDual2)window.Document).SelectItem(item, 1);

其中windowSHDocVw.InternetExplorer,而itemShell32.FolderItem(在上例中来自folder.Items())。 要取消选择,请将0代替1作为第二次重载。