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

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

Во-первых, я начинаю с явного вызова explorer.exe:

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

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

Process.Start(pathToDir);

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

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


person John NoCookies    schedule 30.01.2013    source источник
comment
попробуйте "/select," + pathToFile (без пробела между запятой и путем)   -  person Ben Boyle    schedule 07.04.2021


Ответы (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);
person Simon Mourier    schedule 30.01.2013