我正在尝试拉出打开的资源管理器窗口中列出的文件和目录列表(按照它们显示的顺序),以便我可以查看它,然后将焦点设置为特定项目。 / 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那种东西?
答案 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);
其中window
是SHDocVw.InternetExplorer
,而item
是Shell32.FolderItem
(在上例中来自folder.Items()
)。
要取消选择,请将0
代替1
作为第二次重载。