【问题标题】:Programmatically selecting file in explorer在资源管理器中以编程方式选择文件
【发布时间】:2010-06-09 22:00:17
【问题描述】:

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

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

【问题讨论】:

标签: c++ windows explorer shellexecute


【解决方案1】:

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

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

【讨论】:

  • 看来 chromium 也使用这个,见 src.chromium.org/svn/trunk/src/chrome/browser/…
  • 这是人们可以调用的二进制编译版本(对于那些不喜欢 COM 的人):gist.github.com/rdp/9748303
  • 记得在调用SHOpenFolderAndSelectItems(...)之前调用CoInitializeEx(...),并确保将路径中的所有正斜杠替换为反斜杠。不做这两件事中的任何一件都会导致失败。
  • 如果它对某人有用,昨天发布了一个有关如何将 SHOpenFolderandSelectItems() 与一组项目一起使用的相关问题。 stackoverflow.com/questions/47564192/…
【解决方案2】:

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

/n,/select,<path_and_filename>

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

【讨论】:

  • SHOpenFolderAndSelectItems 对我来说会失败,除非我使用格式完美的完整路径,例如 c:\dev
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多