打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)

Posted

技术标签:

【中文标题】打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)【英文标题】:Open Windows Explorer directory, select a specific file (in Delphi) 【发布时间】:2013-02-24 09:51:43 【问题描述】:

我有一个程序可以在 Windows 资源管理器中打开一个通过目录路径传递的文件夹:

procedure TfrmAbout.ShowFolder(strFolder: string);
begin
   ShellExecute(Application.Handle,PChar('explore'),PChar(strFolder),nil,nil,SW_SHOWNORMAL);
end;

有没有办法也传递这个文件名(完整的文件名路径或只是名称+扩展名)并在 Windows 资源管理器中打开文件夹但也被突出显示/选择?我要去的位置有很多文件,然后我需要在 Windows 中操作该文件。

【问题讨论】:

使用下面 Andreas Rejbrand 回答的方法,我遇到了奇怪的活动,我在 Win7 Pro 32bit 上,有时使用它时,它会打开目录但不突出显示文件,或者它打开一些不寻常的目录并突出显示完全不相关的内容。例如,刚才我用它来选择一个文件,但它打开了我的个人用户文件夹并突出显示了“我的文档”文件夹,而我将它指向的文件甚至不在同一个硬盘上。 我刚刚注意到这个问题的趋势,当文件名中有某些字符时会发生这种情况,例如逗号,它会抛出命令 注意:我的上述问题已通过 Andreas 的更新得到解决,其中包括另一个更具体和可靠的解决方案。 【参考方案1】:

是的,您可以在拨打explorer.exe时使用/select flag:

ShellExecute(0, nil, 'explorer.exe', '/select,C:\WINDOWS\explorer.exe', nil,
  SW_SHOWNORMAL)

一种更花哨(也许也更可靠)的方法 (uses ShellAPI, ShlObj):

const
  OFASI_EDIT = $0001;
  OFASI_OPENDESKTOP = $0002;

$IFDEF UNICODE
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32
  name 'ILCreateFromPathW';
$ELSE
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32
  name 'ILCreateFromPathA';
$ENDIF
procedure ILFree(pidl: PItemIDList) stdcall; external shell32;
function SHOpenFolderAndSelectItems(pidlFolder: PItemIDList; cidl: Cardinal;
  apidl: pointer; dwFlags: DWORD): HRESULT; stdcall; external shell32;

function OpenFolderAndSelectFile(const FileName: string): boolean;
var
  IIDL: PItemIDList;
begin
  result := false;
  IIDL := ILCreateFromPath(PChar(FileName));
  if IIDL <> nil then
    try
      result := SHOpenFolderAndSelectItems(IIDL, 0, nil, 0) = S_OK;
    finally
      ILFree(IIDL);
    end;
end;

【讨论】:

传递给参数的字符串必须以null结尾是吗? 是的,编译器确保有空终止符。 请注意:***.com/questions/4291793/… 这并不总是有效,事实上我只是亲眼目睹了它不起作用。 我希望这不会因为重复而关闭,因为正如我在上述问题的评论中所说,另一个接受的答案是 C++ 并使用与此不同的机制。我想看看是否有人可以使用转换为 Delphi 的代码来回答这个问题,因为我不知道如何重写它。 @JerryDodge:我为你实现了。【参考方案2】:

delphi.lonzu.net 和 swissdelphicenter 的答案提供了一个更简单的解决方案。我只在 Windows 10、1909 上测试过,但它的要点是:

uses ShellApi, ...
...
var
   FileName : TFileName;
begin
  FileName := 'c:\temp\somefile.html';

  ShellExecute(Handle, 'OPEN', 
    pchar('explorer.exe'), 
    pchar('/select, "' + FileName + '"'), 
    nil, 
    SW_NORMAL);
end;

这简单易用。我不知道它是否适用于旧版本的 Windows。

【讨论】:

它甚至可以在 Windows XP 中使用,所以这对大多数人来说可能没问题。 我创建了一个空单元,需要更多用途,如 Winapi.Windows、Winapi.Messages、Forms,

以上是关于打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行CMDIDEA的终端快速在explorer/finder资源管理器访达中打开对应的目录(WindowsMac)

在File Explorer的当前路径上直接打开VS Code

eclipse怎么打开project explorer

将Cygwin Emacs设为Windows explorer默认打开程序

eclipse中安装Open Explorer

每次打开IE9都会弹出“了解 Internet Explorer 9 ”的页面,怎么不让他弹出来吗?