2013-03-08 19 views
11

Ho un procedimento per aprire una cartella in Esplora risorse che viene passato un percorso di directory:Aprire Esplora risorse di directory, selezionare un file specifico (in Delphi)

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

C'è un modo per passare anche questo un nome del file (il percorso completo del nome del file o solo il nome + l'estensione) e la cartella aperta in Esplora risorse, ma anche evidenziata/selezionata? La posizione in cui sto andando ha molti file e ho bisogno di manipolare quel file in Windows.

+0

Utilizzando il metodo come risposta di Andreas Rejbrand in basso, sto colpendo vicoli ciechi con strane attività, sono su Win7 Pro a 32 bit e, a volte, quando lo uso, apre la directory ma non evidenzia il file, o apre alcuni fuori dalla directory ordinaria e evidenzia qualcosa di completo irrilevante. Ad esempio, solo ora l'ho usato per selezionare un file, ma ha aperto la mia cartella utente personale e evidenziato la cartella "Documenti", quando il file che stavo indirizzando non è nemmeno sullo stesso disco rigido. –

+0

Ho appena notato una tendenza con questo problema, accade quando ci sono determinati caratteri nel nome del file, ad esempio una virgola, che solleva il comando –

+0

NOTA: il mio problema precedente è stato risolto con un aggiornamento di Andreas che includeva un altro più specifico e affidabile soluzione. –

risposta

33

Sì, è possibile utilizzare il /select flag quando si chiama explorer.exe:

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

Un po 'più di fantasia (e forse anche più affidabile) approccio (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

la stringa passata al parametro deve essere nullo terminato vero? – Raul

+0

Sì, il compilatore si assicura che ci siano terminatori null. –

+1

Nota: http://stackoverflow.com/questions/4291793/selecting-file-in-windows-explorers-does-not-always-work?rq=1 Questo non sempre funziona, e in effetti sono appena stato testimone non funziona da solo. –

Problemi correlati