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

本文关键字:焦点 如果 存在 代码 Windows 文件 中文 情况下 资源管理器 | 更新日期: 2023-09-27 17:56:42

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

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

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

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

Process.Start(pathToDir);

这要么打开一个新窗口,要么聚焦一个旧窗口,但给我没有选择文件的选项。

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

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

我不知道是否可以

使用进程启动,但以下代码仅在需要时在包含文件夹上打开 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);