Программный выбор файла в проводнике - PullRequest
17 голосов
/ 10 июня 2010

В моем приложении я могу программно открыть проводник и выбрать файл, используя следующий код:

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}

Моя проблема в том, что если я вызываю эту функцию второй раз с другим файлом, но в той же папке, выбор в проводнике не изменяется на новый файл, но остается в предыдущем файле.

Например, если я вызову свою функцию с помощью C:\path\to\file1.txt, откроется новое окно проводника и будет выбрано file1.txt. Если я вызову свою функцию второй раз с C:\path\to\file2.txt, будет активировано существующее окно проводника, но выбор все равно будет на file1.txt.

Есть ли способ заставить проводник обновить выделение или лучший способ сделать это?

РЕДАКТИРОВАТЬ:

Поведение, упомянутое выше, было в Windows XP. Кажется, поведение на Vista / Win7 отличается. Каждый вызов открывает новый экземпляр проводника и выбирает файл.

Моя главная цель - скопировать опцию Visual Studio в Открыть содержащую папку документа. Эта функция в Visual Studio работает одинаково на XP, Vista и Win7. Он не создаст новый экземпляр, если другой экземпляр с той же папкой уже открыт, но обновит выбор до нового файла.

Если кто-нибудь знает, как Visual Studio выполняет это, я хотел бы знать об этом.

Ответы [ 3 ]

28 голосов
/ 10 июня 2010

Нашел ответ на мой вопрос. Мне нужно использовать функцию оболочки SHOpenFolderAndSelectItems. Вот код для функции, если кто-то когда-либо заинтересован:

void BrowseToFile(LPCTSTR filename)
{
    ITEMIDLIST *pidl = ILCreateFromPath(filename);
    if(pidl) {
        SHOpenFolderAndSelectItems(pidl,0,0,0);
        ILFree(pidl);
    }
}
2 голосов
/ 05 декабря 2011

Попробуйте параметр '/ n'.Это, однако, откроет новую папку - возможно, уже открыт.Но, по крайней мере, указанный вами файл выбран.

/n,/select,<path_and_filename>

SHOpenFolderAndSelectItems всегда терпит неудачу в моем случае, и я не могу понять почему.Кстати, вы должны вызвать CoInitialize / CoInitializeEx перед вызовом этого.

0 голосов
/ 10 июня 2010

В случае, если вы обрисовали его в общих чертах, окно файла выбирает файл только при его инициализации, а не при активации.

Хотя это похоже на клудж, вы можете обнаружить XP и только для этой ОС закрыть диалоговое окно, используя его дескриптор, и открыть новый, чтобы указать другой файл с помощью.

...