在我的应用程序中,我可以以编程方式打开资源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,只有该操作系统关闭使用其句柄对话框,并打开一个新的目标另一个文件。