在浏览器中以编程方式select文件

在我的应用程序中,我可以以编程方式打开资源pipe理器并使用以下代码select一个文件

void BrowseToFile(LPCTSTR filename) { CString strArgs; strArgs = _T("/select,\""); strArgs += filename; strArgs += _T("\""); ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL); } 

我的问题是,如果我用不同的文件第二次调用这个函数,但在同一个文件夹中,资源pipe理器中的select不会更改为新文件,而是保留在以前的文件上。

例如,如果我用C:\path\to\file1.txt调用我的函数,将会打开一个新的资源pipe理器窗口,并selectfile1.txt 。 如果我再次用C:\path\to\file2.txt调用我的函数,现有的资源pipe理器窗口将被激活,但是select仍然在file1.txt

有没有办法强制资源pipe理器更新select或更好的方法来完成这个?

编辑:

上面提到的行为是在Windows XP上。 看来Vista / Win7上的行为是不同的。 每个调用将打开一个新的资源pipe理器实例并select该文件。

我的主要目标是复制Visual Studio选项以打开文档的包含文件夹 。 在Visual Studio中的这个function在XP,Vista和Win7上performance相同。 如果具有相同文件夹的另一个实例已经打开,它将不会创build新实例,但会将select更新为新文件。

如果有人知道Visual Studio如何完成这个,我很想知道它。

找到了我的问题的答案。 我需要使用shell函数SHOpenFolderAndSelectItems 如果有人感兴趣,下面是该函数的代码:

 void BrowseToFile(LPCTSTR filename) { ITEMIDLIST *pidl = ILCreateFromPath(filename); if(pidl) { SHOpenFolderAndSelectItems(pidl,0,0,0); ILFree(pidl); } } 

试试'/ n'选项。 然而,这将打开一个新的文件夹 – 可能已经打开。 但是,至少,您指定的文件被选中。

 /n,/select,<path_and_filename> 

SHOpenFolderAndSelectItems总是失败,我不知道为什么。 顺便说一句,你必须调用CoInitialize / CoInitializeEx在调用这个之前。

在出现的情况下,文件窗口只会在初始化时选择文件,而不是激活时。

虽然这感觉像一个杂凑,你可以检测XP,只有该操作系统关闭使用其句柄对话框,并打开一个新的目标另一个文件。