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

C# 在C中打开的资源管理器窗口中获取文件/目录列表,c#,winapi,windows-shell,C#,Winapi,Windows Shell,我正试图从一个打开的资源管理器窗口中按显示顺序列出文件和目录列表,以便我可以查看,然后将焦点设置为特定项目 我发现此代码允许我获取所选项目,但我不确定是否可以使用此方法获取所有项目: 看起来这个Shell32方法还允许我以编程方式选择一个项目,这是我试图完成的另一部分。我将调用SelectItem而不是SelectedItems,尽管我不知道如何使用该函数 有人知道从打开的Windows资源管理器窗口中获取文件/目录列表并理想地将焦点设置为项目的方法吗?也许是P/Invoke之类的东西?我能够修

我正试图从一个打开的资源管理器窗口中按显示顺序列出文件和目录列表,以便我可以查看,然后将焦点设置为特定项目

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

看起来这个Shell32方法还允许我以编程方式选择一个项目,这是我试图完成的另一部分。我将调用SelectItem而不是SelectedItems,尽管我不知道如何使用该函数


有人知道从打开的Windows资源管理器窗口中获取文件/目录列表并理想地将焦点设置为项目的方法吗?也许是P/Invoke之类的东西?

我能够修改我找到的代码片段,以列出所有文件/目录,而不仅仅是选定的文件/目录

以下是我最终得到的结果:

    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.IShellFolderViewDual2window.Document.SelectItemitem,1

其中window是SHDocVw.InternetExplorer,item是上述示例中folder.Items中的Shell32.FolderItem。 要取消选择,请传入0而不是1作为第二个重载

    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;
    }