19

ディレクトリ パスを渡された Windows エクスプローラーでフォルダーを開く手順があります。

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

これにファイル名 (完全なファイル名のパスまたは名前 + 拡張子のみ) を渡し、Windows エクスプローラーでフォルダーを開くだけでなく、強調表示/選択する方法はありますか? 私が行く場所には多くのファイルがあり、Windows でそのファイルを操作する必要があります。

4

2 に答える 2

48

はい、次のように呼び出すときに/selectフラグexplorer.exeを使用できます。

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;
于 2013-03-08T18:41:17.847 に答える
1

delphi.lonzu.netswissdelphicenterの回答は、これに対するより簡単な解決策を提供します。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 で動作するかどうかはわかりません。

于 2020-04-05T22:46:49.337 に答える