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

Joh*_*ies 15 .net c# directory explorer windows-explorer

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

首先,我首先明确地调用explorer.exe:

arg = "/select, " + pathToFile;
Process.Start("explorer.exe", arg);
Run Code Online (Sandbox Code Playgroud)

这会打开并选择一个正常的窗口,但问题是它将始终打开一个新窗口,即使存在一个窗口.所以我尝试了这个:

Process.Start(pathToDir);
Run Code Online (Sandbox Code Playgroud)

这可以打开一个新窗口或聚焦旧窗口,但不能选择文件.

我能做什么?我查看了explorer论据,但我没有看到任何可以使用的内容.我能想到的最后一个选项是获取已经打开的窗口列表并使用一些WINAPI级别的代码来处理它,但这似乎有点过分.

Sim*_*ier 12

我不知道是否可以使用进程启动,但以下代码仅在需要时打开包含文件夹的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);
Run Code Online (Sandbox Code Playgroud)