以编程方式在资源管理器中选择文件

时间:2010-06-09 22:00:18

标签: c++ windows explorer shellexecute

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

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 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:2)

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

/n,/select,<path_and_filename>

SHOpenFolderAndSelectItems 总是在我的情况下失败,我无法弄清楚原因。顺便说一句,你必须在调用它之前调用CoInitialize / CoInitializeEx。

答案 2 :(得分:0)

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

虽然这感觉像是一个kludge,但你可以检测到XP,只有那个操作系统使用它的句柄关闭对话框并打开一个新目标来定位另一个文件。