11

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

不过,我并不完全在那里。一方面,GetForegroundWindow从哪里来?另一方面,编译器在线抱怨

var shell = new Shell32.Shell();

“找不到类型或命名空间名称‘Shell32’(您是否缺少 using 指令或程序集引用?)”。我添加了 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);
            }
        }
    }
4

2 回答 2

8

您不需要获取(资源管理器的)句柄。

在项目的参考资料中添加在该COM部分中找到的这些参考资料。需要引用 SHDocVw,它是Microsoft Internet ControlsCOM 对象和Shell32,它是 Microsoft Shell 控件和自动化 COM 对象。

然后添加您的:

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);
          }
        }
      }
于 2013-01-07T10:38:51.310 回答
1

GetForegroundWindow 是一个 Win32 API 函数,要使用它,您需要按照此处的说明导入它: getforegroundwindow (user32)

Shell32 在这里描述:

在 C# 中使用 shell 32

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

于 2013-01-07T09:54:17.393 回答