【问题标题】:How do I display Explorer with a file selected?如何显示已选择文件的资源管理器?
【发布时间】:2011-09-07 10:23:13
【问题描述】:

显示带有选定文件的资源管理器窗口的 API 调用是什么?当您单击 .lnk 快捷方式的“属性”对话框中的“查找目标...”按钮时会发生什么情况?我知道有这个功能(或接口方法),但我忘记了名字,再也找不到了。

请注意,我知道 explorer /select,<pathname> 命令行,并且对使用它而不是 API 调用感兴趣。

【问题讨论】:

  • 现在还为时不晚,@User。关闭的问题不允许新的答案,但它们仍然可以编辑,并且可以重新打开。请编辑问题以询问您真正想要什么。我重申我之前评论中的问题。您想发现快捷方式目标的路径,还是想显示资源管理器?
  • @Rob - 他想打开资源管理器并专注于给定文件;就这样。我试图编辑问题,但有人拒绝了它。
  • 这个问题完全没有问题
  • @sam:反对票针对的是原始问题。如果您查看编辑历史记录,您会注意到原始版本与当前版本有很大不同。
  • @sam - 现在我删除了我的反对票并投了赞成票,因为这个问题很有趣。很遗憾,花了 5 个小时才弄清楚这里问的是什么 :)

标签: windows delphi winapi shell


【解决方案1】:

此函数打开资源管理器,并选择指定的文件:

uses ShellAPI, ...;

procedure TForm1.ShowFile(const aFileName:String);
begin
  ShellExecute(Handle, 'OPEN', PChar('explorer.exe'), PChar('/select, "' + aFileName + '"'), nil, SW_NORMAL)
end;

procedure TForm1.ShowFolder(const aPath:String);
begin
  ShellExecute(Handle, 'OPEN', PChar('explorer.exe'), PChar('/root, "' + aPath + '"'), nil, SW_NORMAL) 
end;

或者这是您不想使用的“命令行”?

【讨论】:

  • +1;这就是 Andreas 的建议,但 OP 说it's very similar (but actually different)
  • @Sertac - 我也是,这就是这里所要求的(除了它是命令行方式),我更喜欢这个而不是实现 Windows Vista 中进一步引入的相当复杂的界面。我在 Windows XP 和 Windows 7 中测试过它。
  • 这正是 daemon_x 几小时前所建议的,而 OP 否决并否定了 cmets,导致 daemon_x 删除了他的答案。
  • @Ken - 我只发布了探索文件夹(ShellExecute 的explore 操作)而没有选择目标文件,所以我错了。安德烈亚斯首先提到了这一点。
  • @daemon_x:但现在我关于/select 的原始评论已被站点管理员删除,原因不明。这个问题已经变得相当混乱了!
【解决方案2】:

您需要SHOpenFolderAndSelectItems。这个问题在这里很早就讨论过了—— Programmatically selecting file in explorer
首次使用SHOpenFolderAndSelectItems之前不要忘记致电CoInitialize

【讨论】:

  • 就是这个功能!资源管理器窗口打开并在适用时重复使用,谢谢!
  • '这就是功能'如果你喜欢玩 COM。
【解决方案3】:

我想你正在寻找IExplorerBrowser::BrowseToObject。基于非常模糊、非具体的问题和 cmet 在被要求时没有额外信息,这是我能提供的最好的猜测IExplorerBrowser 还具有许多您可能想要探索的附加功能,以防这种特定方法不是您想要找到的。

【讨论】:

  • 最低支持的操作系统是 Vista,我想知道 9x、2K、XP 是否确实解决了链接问题并按照 Andreas 的建议使用了“explorer /select”...
  • @user759588 - 我会使用提到的IExplorerBrowser::BrowseToObject。你问我要传递什么作为punk 参数。我的猜测是 IPersistFile 变量类型。
  • 为什么你更喜欢 BrowseToObject 而不是 BrowseToIDList,@Daemon_x? IShellLink 对象提供它所指向的事物的字符串或 ItemIDList。 BrowseToIDList 似乎可以直接使用 ItemIDList,而 BrowseToObject 将需要生成 IShellFolder 或 IShellItem — 实现 IPersistFolder2 或 IPersistIDList 的东西。 BrowseToObject 要做的第一件事就是调用 IPersistFolder2.GetCurFolder 或 IPersistIDList.GetIDList 来获取 ItemIDList。我说跳过中间人。
  • @User - (1) 这就是我想知道的原因。如果 MS 从未留下未记录的接口,我敢肯定。 (2) exposed 接口直接与 id 列表一起操作。如果 shell 从未超出 id 列表,它就无法复制文件 f.i.
  • @Sertac Akyuz,嗯,是和不是,ITEMIDLIST 是 shell 的主要数据类型,本质上是 preparsed 路径名,绝对和相对,映射在桌面文件夹根目录下(什么为什么folder 术语比directory 更广泛)。只需比较接受路径和 PIDL 的 API 数量。
【解决方案4】:

既然你只想要一个名字:IShellLink?

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2012-05-14
    相关资源
    最近更新 更多