在 C# 中监视资源管理器中的文件选择(如剪贴板监视)

发布于 2024-08-23 20:03:49 字数 1101 浏览 9 评论 0原文

我正在尝试创建一个小帮助应用程序,一种情况是“文件重复查找器”。我想做的是:

  • 我启动我的 C# .NET 应用程序,它给了我一个空列表。
  • 启动普通的 Windows 资源管理器,在某个文件夹中选择一个文件
  • C# 应用程序告诉我有关该文件的信息(例如重复项)

如何在“普通”Windows 资源管理器实例中监视当前选定的文件。我是否必须使用 .NET 启动实例才能获得进程的句柄?我是否需要一个句柄,或者是否有一些我可以在 C# 内部监视的“全局挂钩”。它有点像监视剪贴板,但不完全相同...

感谢任何帮助(如果您没有代码,只需将我指向正确的互操作、dll 或帮助页面:-) 谢谢,Chris

编辑1(当前来源,感谢Mattias)

using SHDocVw;
using Shell32;

public static void ListExplorerWindows()
{
    foreach (InternetExplorer ie in new ShellWindowsClass())
        DebugExplorerInstance(ie);
}

public static void DebugExplorerInstance(InternetExplorer instance)
{
    Debug.WriteLine("DebugExplorerInstance ".PadRight(30, '='));
    Debug.WriteLine("FullName " + instance.FullName);
    Debug.WriteLine("AdressBar " + instance.AddressBar);
    var doc = instance.Document as IShellFolderViewDual ;
    if (doc != null)
    {
        Debug.WriteLine(doc.Folder.Title);
        foreach (FolderItem item in doc.SelectedItems())
        {
            Debug.WriteLine(item.Path);
        }
    }
}

I am trying to create a little helper application, one scenario is "file duplication finder". What I want to do is this:

  • I start my C# .NET app, it gives me an empty list.
  • Start the normal windows explorer, select a file in some folder
  • The C# app tells me stuff about this file (e.g. duplicates)

How can I monitor the currently selected file in the "normal" windows explorer instance. Do I have to start the instance using .NET to have a handle of the process. Do I need a handle, or is there some "global hook" I can monitor inside C#. Its a little bit like monitoring the clipboard, but not exactly the same...

Any help is appreciated (if you don't have code, just point me to the right interops, dlls or help pages :-) Thanks, Chris

EDIT 1 (current source, thanks to Mattias)

using SHDocVw;
using Shell32;

public static void ListExplorerWindows()
{
    foreach (InternetExplorer ie in new ShellWindowsClass())
        DebugExplorerInstance(ie);
}

public static void DebugExplorerInstance(InternetExplorer instance)
{
    Debug.WriteLine("DebugExplorerInstance ".PadRight(30, '='));
    Debug.WriteLine("FullName " + instance.FullName);
    Debug.WriteLine("AdressBar " + instance.AddressBar);
    var doc = instance.Document as IShellFolderViewDual ;
    if (doc != null)
    {
        Debug.WriteLine(doc.Folder.Title);
        foreach (FolderItem item in doc.SelectedItems())
        {
            Debug.WriteLine(item.Path);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀念你的温柔 2024-08-30 20:03:49

您可以使用 shell 自动化接口来完成此操作。基本过程是

  1. 在 Shdocwv.dll 上运行 Tlbimp 并
    Shell32.dll(或者直接添加一个
    参考VS)。
  2. 创建一个
    ShellWindows 的实例
    收集和迭代。这将
    包含 Windows 资源管理器和
    Internet Explorer 窗口。
  3. 为了
    Windows 资源管理器窗口
    IWebBrowser2.Document 属性将
    返回 IShellFolderViewDual
    参考。
  4. IShellFolderViewDual
    有一个 SelectedItems 方法,您可以
    查询和更改您的事件
    可以处理。

You can do this with the shell automation interfaces. The basic process is to

  1. Run Tlbimp on Shdocwv.dll and
    Shell32.dll (or directly add a
    reference from VS).
  2. Create an
    instance of the ShellWindows
    collection and iterate. This will
    contain both Windows Explorer and
    Internet Explorer windows.
  3. For
    Windows Explorer windows, the
    IWebBrowser2.Document property will
    return a IShellFolderViewDual
    reference.
  4. The IShellFolderViewDual
    has a SelectedItems method you can
    query and an event for changes you
    can handle.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文