20

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

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 如何做到这一点,我很想知道。

4

3 回答 3

36

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

void BrowseToFile(LPCTSTR filename)
{
    ITEMIDLIST *pidl = ILCreateFromPath(filename);
    if(pidl) {
        SHOpenFolderAndSelectItems(pidl,0,0,0);
        ILFree(pidl);
    }
}
于 2010-06-10T00:15:13.720 回答
4

试试“/n”选项。但是,这将打开一个新文件夹 - 可能已经打开。但是,至少选择了您指定的文件。

/n,/select,<path_and_filename>

SHOpenFolderAndSelectItems在我的情况下总是失败,我不知道为什么。顺便说一句,您必须在调用此之前调用 CoInitialize/CoInitializeEx。

于 2011-12-05T19:07:25.063 回答
0

在您概述的情况下,文件窗口仅在初始化而不是激活时选择文件。

尽管这感觉像是一个杂物,但您可以检测到 XP,并且仅针对该操作系统使用其句柄关闭对话框并打开一个新的对话框来定位另一个文件。

于 2010-06-09T22:34:28.273 回答