打开Windows资源管理器并选中文件的代码(如果存在则聚焦)

20

我的目标是编写一段C#代码,以打开Windows资源管理器窗口,并选择特定的文件。如果这样的窗口已经打开,我想将其置于前台。我尝试了两个选项。

首先,我通过显式调用 explorer.exe 来开始:

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

这段代码可以成功打开和选择一个窗口,但问题在于它总是会新打开一个窗口,即使已经存在一个窗口。因此,我尝试了以下代码:

Process.Start(pathToDir);

这会打开一个新窗口或聚焦到旧窗口,但不提供选择文件的选项。

我该怎么办?我查看了explorer的参数,但没有发现任何可以使用的选项。最后的备选方案是获取已经打开的窗口列表,并使用一些WINAPI级别的代码来处理它,但这似乎过于复杂。


2
尝试使用 "/select," + pathToFile(逗号和路径之间没有空格) - Ben Boyle
1个回答

18

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

它使用SHOpenFolderAndSelectItems函数的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);

1
将近10年过去了,但仍在工作。如果可以的话,我会给它+10分。 - Metro Smurf

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