Код для открытия проводника Windows (или фокус, если существует) с выбранным файлом

Моя цель - написать код С#, который откроет окно проводника Windows, с выбранным конкретным файлом. Если такое окно уже открыто, я хочу довести его до фронта. Я попробовал два варианта.

Сначала я начинаю с явного вызова explorer.exe:

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

Это открывает и выбирает окно в порядке, но проблема в том, что он всегда откроет новое окно, даже если оно существует. Поэтому я попробовал это:

Process.Start(pathToDir);

Это либо открывает новое окно, либо фокусируется на старом, но не дает мне выбора для выбора файла.

Что я могу сделать? Я посмотрел на explorer аргументы, и я не вижу ничего, что мог бы использовать. Последний вариант, который я могу придумать, - это получить список уже открытых окон и использовать некоторый код уровня WINAPI для его обработки, но это похоже на перебор.

Ответ 1

Я не знаю, возможно ли это с помощью запуска процесса, но следующий код открывает проводник Windows в содержащей папке только при необходимости (если папка уже открыта или выбрана в другом файле, она повторно используется) и выбирает желаемый файл.

Он использует код взаимодействия p/invoke на функции SHOpenFolderAndSelectItems:

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);