如何从C#中获取Windows资源管理器中选定的文件?

11

我需要获取在Windows资源管理器中选择的文件的当前集合。我从这里找到了下面的代码。

不过,还有一些问题需要解决。首先,GetForegroundWindow是什么意思?其次,在该行上,编译器会发出警告。

var shell = new Shell32.Shell();

说:

"类型或命名空间名称 'Shell32' 无法找到(是否缺少使用指令或程序集引用?)"。我已将SHDocVw添加为引用,但我仍无法通过编译器。请问有人能帮我完成这个吗?

    IntPtr handle = GetForegroundWindow();

    ArrayList selected = new ArrayList();
    var shell = new Shell32.Shell();
    foreach(SHDocVw.InternetExplorer window in shell.Windows()) {
        if (window.HWND == (int)handle)
        {
            Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
            foreach(Shell32.FolderItem item in items)
            {
                selected.Add(item.Path);
            }
        }
    }

2个回答

8

你不需要获取资源管理器的句柄。

在项目的引用中添加这些在COM部分找到的引用。其中一个需要引用Microsoft Internet Controls COM对象中的SHDocVw,另一个需要引用Microsoft Shell Controls和Automation COM对象中的Shell32

然后添加你的代码:

using System.Collections;
using Shell32;
using System.IO;

那么这将会生效:
      string filename;  
      ArrayList selected = new ArrayList();
      foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows())
      {
        filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
        if (filename.ToLowerInvariant() == "explorer")
        {
          Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
          foreach (Shell32.FolderItem item in items)
          {
            selected.Add(item.Path);
          }
        }
      }

这看起来更好,除了我还有另一个编译问题: - Barry Dysert
编译问题是:Interop 类型 'SHDocVw.ShellWindowsClass' 无法嵌入。请改用适用的接口。 - Barry Dysert
1
我把ShellWindowsClass改成了ShellWindows,现在看起来可以运行了。谢谢大家! - Barry Dysert
我已经编辑了答案,以解决“无法嵌入”的问题。答案https://dev59.com/gFHTa4cB1Zd3GeqPVN3p#4174056解释了为什么ShellWindows比ShellWindowsClass更正确。 - peterflynn

1

GetForegroundWindow 是一个 Win32 API 函数,要使用它,您需要按照此处所述进行导入: getforegroundwindow (user32)

Shell32 在此处有描述:

在C#中使用 shell 32

最后,我不知道您的任务是什么,但通常如果需要选择一些文件并访问此集合,则需要使用 FileOpenDialog


感谢您的帮助,我已经成功编译了程序,但似乎它并没有起作用。实际上,我在想它怎么可能会起作用呢?当我获取前台窗口时,它不会返回我的程序正在运行的窗口的句柄,而是返回Windows资源管理器中所选文件列表的窗口的句柄,这是为什么呢? - Barry Dysert
GetForegroundWindow方法检索前台窗口的句柄(即用户当前正在使用的窗口)。因此,我不知道您的应用程序应该如何工作。如果您需要枚举所有窗口,请参考http://www.codeproject.com/Articles/2286/Window-Hiding-with-C项目。 - platon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接