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

22
在我的应用程序中,我可以使用以下代码以编程方式打开资源管理器并选择文件:
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 是如何实现这一点的,我很想知道。

我在Windows 7 x64上没有看到这种行为。两个窗口都正确打开,每个窗口都选择了正确的文件。 - Julien Lebosquain
你说得对,Vista和Win 7上的行为是不同的。我已经更新了我的问题来提到这一点。 - flashk
这两个问题似乎有关联:https://dev59.com/X1PTa4cB1Zd3GeqPmtKZ 和 https://dev59.com/Xl3Ua4cB1Zd3GeqP_2Gu - rogerdpack
3个回答

38

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

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

似乎Chromium也使用了这个,可以参考http://src.chromium.org/svn/trunk/src/chrome/browser/platform_util_win.cc - rogerdpack
这里有一个二进制编译版本,人们可以调用它(对于那些不喜欢COM的人):https://gist.github.com/rdp/9748303 - rogerdpack
1
在调用 SHOpenFolderAndSelectItems(...) 之前,请记得调用 CoInitializeEx(...),并确保将路径中的所有正斜杠替换为反斜杠。如果不执行这两个步骤中的任何一个,将导致操作失败。 - Tim Severeijns
如果有人需要的话,我昨天发布了一个相关问题,关于如何使用SHOpenFolderandSelectItems()与一组项目。https://stackoverflow.com/questions/47564192/shopenfolderandselectitems-with-arrays - Stéphane

4
尝试使用“/n”选项。这将打开一个新的文件夹,但可能已经被打开。但是,至少会选择您指定的文件。
/n,/select,<path_and_filename>

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


SHOpenFolderAndSelectItems 对我来说会失败,除非我使用格式完美的完整路径,例如 c:\dev。 - rogerdpack

0
在你所描述的情况下,似乎文件窗口只有在初始化时才选择文件,而不是在激活时选择。
虽然这感觉像一个临时解决方案,但你可以检测XP系统,并仅针对该操作系统使用其句柄关闭对话框并打开一个新的对话框以定位到另一个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接