В моем приложении я могу программно открыть проводник и выбрать файл с помощью следующего кода:
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 Открыть Containing Folder документа. Эта функция в Visual Studio ведет себя то же на XP, Vista и Win7. Это не создаст новый экземпляр, если другой экземпляр с той же папкой будет уже открыт, но это обновит выбор в новый файл.
Если кто-либо знает, как Visual Studio выполняет это, я хотел бы знать об этом.
Нашел ответ на мой вопрос. Мне нужно использовать функцию оболочки SHOpenFolderAndSelectItems
. Вот код для функции, если кто-то когда-либо заинтересован:
void BrowseToFile(LPCTSTR filename)
{
ITEMIDLIST *pidl = ILCreateFromPath(filename);
if(pidl) {
SHOpenFolderAndSelectItems(pidl,0,0,0);
ILFree(pidl);
}
}
В том случае, если вы обрисовали его в общих чертах, окно файла выбирает файл только при его инициализации, а не при активации.
Хотя это похоже на кладж, вы можете обнаружить XP и только для этой ОС закрыть диалоговое окно, используя его дескриптор, и открыть новый, чтобы настроить таргетинг на другой файл.