选择文件打开 Windows 资源管理器(或焦点,如果存在)的代码

Posted

技术标签:

【中文标题】选择文件打开 Windows 资源管理器(或焦点,如果存在)的代码【英文标题】:code to open windows explorer (or focus if exists) with file selected 【发布时间】:2013-01-14 02:10:42 【问题描述】:

我的目标是编写一个 C# 代码,该代码将打开一个 Windows 资源管理器窗口,并选择一个特定的文件。如果这样的窗口已经打开,我想把它带到前面。我尝试了两种选择。

首先,我首先显式调用explorer.exe

arg = "/select, " + pathToFile;
Process.Start("explorer.exe", arg);

这会打开并选择一个窗口,但问题是它总是会打开一个新窗口,即使存在一个。所以我尝试了这个:

Process.Start(pathToDir);

这会打开一个新窗口或聚焦一个旧窗口,但我无法选择文件。

我能做什么?我查看了explorer's arguments 并没有看到任何我可以使用的东西。我能想到的最后一个选择是获取已经打开的窗口列表并使用一些 WINAPI 级别的代码来处理它,但这似乎有点过头了。

【问题讨论】:

试试"/select," + pathToFile(逗号和路径之间没有空格) 【参考方案1】:

我不知道是否可以使用进程启动,但以下代码仅在需要时在包含文件夹上打开 Windows 资源管理器(如果该文件夹已打开,或在另一个文件中选择,则重复使用)并选择想要的文件。

它在SHOpenFolderAndSelectItems function 上使用 p/invoke 互操作代码:

public static void OpenFolderAndSelectFile(string filePath)

    if (filePath == null)
        throw new ArgumentNullException("filePath");

    IntPtr pidl = ILCreateFromPathW(filePath);
    SHOpenFolderAndSelectItems(pidl, 0, IntPtr.Zero, 0);
    ILFree(pidl);


[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr ILCreateFromPathW(string pszPath);

[DllImport("shell32.dll")]
private static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, int cild, IntPtr apidl, int dwFlags);

[DllImport("shell32.dll")]
private static extern void ILFree(IntPtr pidl);

【讨论】:

以上是关于选择文件打开 Windows 资源管理器(或焦点,如果存在)的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“Windows资源管理器”的快捷键?

在单个可用实例中打开文件夹或选择文件

如何启动windows资源管理器

如何打开windows资源管理器

C++ MFC 改变菜单焦点

启动 Windows 资源管理器并突出显示文件