2013-03-08 183 views
11

我有一個程序在Windows資源管理器中打開一個文件夾被傳遞的目錄路徑:打開Windows資源管理器的目錄,選擇(在Delphi)的特定文件

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

有沒有辦法也通過這一個文件名(無論是完整的文件名路徑,或只是名稱+擴展名),並在Windows資源管理器中打開文件夾,但也被突出顯示/選擇?我要去的位置有很多文件,我需要在Windows中操作該文件。

+0

使用方法回答通過下面的Andreas Rejbrand,我遇到了奇怪的活動,我在Win7 Pro 32bit上,並且有時在使用它時,它會打開目錄但不會突出顯示該文件,或者打開一些非常規目錄,強調完整的東西無關緊要。例如,剛纔我用它來選擇一個文件,但它打開我的個人用戶文件夾並突出顯示「我的文檔」文件夾,當我指向它的文件甚至不在同一個硬盤上時。 – 2013-03-25 07:34:23

+0

我剛注意到這個問題的一個趨勢,它發生在文件名中有某些字符時,例如逗號,這會拋出命令 – 2013-03-25 07:42:26

+0

注意:我的上述問題已通過Andreas更新解決,包括另一個更具體和更可靠解。 – 2013-03-25 16:43:22

回答

33

是的,你可以使用/select flag當你調用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; 
+0

傳遞給參數的字符串必須是空終止的嗎? – Raul 2013-03-08 18:49:26

+0

是的,編譯器確保有空終止符。 – 2013-03-08 18:50:03

+1

請注意:http://stackoverflow.com/questions/4291793/selecting-file-in-windows-explorers-does-not-always-work?rq=1這並不總是工作,而我其實只是目睹它不適合我自己。 – 2013-03-25 07:03:41

相關問題