2010-06-09 10 views
17

In meiner Anwendung Auswahl kann ich programmatisch Explorer öffnen und wählen Sie den folgenden Code, um eine Datei mit:Programmatically Datei im Explorer

void BrowseToFile(LPCTSTR filename) 
{ 
    CString strArgs; 
    strArgs = _T("/select,\""); 
    strArgs += filename; 
    strArgs += _T("\""); 

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL); 
} 

Mein Problem ist, dass, wenn ich nenne diese Funktion ein zweites Mal mit einer anderen Datei, aber Im selben Ordner ändert sich die Auswahl im Explorer nicht in die neue Datei, sondern in der vorherigen Datei. Wenn ich beispielsweise meine Funktion mit C:\path\to\file1.txt aufrufen, öffnet sich ein neues Explorer-Fenster und file1.txt wird ausgewählt. Wenn ich meine Funktion ein zweites Mal mit C:\path\to\file2.txt aufrufen, wird das vorhandene Explorer-Fenster aktiviert, aber die Auswahl bleibt weiterhin auf file1.txt.

Gibt es eine Möglichkeit, Explorer zu zwingen, die Auswahl zu aktualisieren oder einen besseren Weg, dies zu erreichen?

EDIT:

Die oben erwähnte war Verhalten unter Windows XP. Es scheint, dass das Verhalten auf Vista/Win7 anders ist. Bei jedem Aufruf wird eine neue Instanz des Explorers geöffnet und die Datei ausgewählt.

Mein Hauptziel ist es, die Visual Studio-Option auf Open Containing Folder eines Dokuments zu replizieren. Diese Funktion in Visual Studio verhält sich unter XP, Vista und Win7 identisch. Es wird keine neue Instanz erstellt, wenn bereits eine andere Instanz mit demselben Ordner geöffnet ist. Die Auswahl wird jedoch auf die neue Datei aktualisiert.

Wenn jemand weiß, wie Visual Studio dies erreicht, würde ich gerne darüber wissen.

+0

Ich sehe dieses Verhalten nicht auf Windows 7 x64. Zwei Fenster werden korrekt geöffnet, wobei jeweils die richtige Datei ausgewählt ist. –

+0

Sie haben Recht, das Verhalten auf Vista und Win 7 ist anders. Ich habe meine Frage aktualisiert, um dies zu erwähnen. – flashk

+0

http://stackoverflow.com/questions/4831101/how-to-re-use-existing-ready-opened-windows-explorer-window-to-launch-explorer und http://stackoverflow.com/questions/8182494/how-can-i-set-ein-existing-explorer-exe-instance-to-select-a-file scheint verwandt zu sein ... – rogerdpack

Antwort

25

Die Antwort auf meine Frage gefunden. Ich muss die Shell-Funktion SHOpenFolderAndSelectItems verwenden. Hier ist der Code für die Funktion, wenn jemand jemals daran interessiert ist:

void BrowseToFile(LPCTSTR filename) 
{ 
    ITEMIDLIST *pidl = ILCreateFromPath(filename); 
    if(pidl) { 
     SHOpenFolderAndSelectItems(pidl,0,0,0); 
     ILFree(pidl); 
    } 
} 
+0

erscheint chrom verwendet dies auch, siehe http://src.chromium.org /svn/trunk/src/chrome/browser/platform_util_win.cc – rogerdpack

+0

Hier ist eine binär kompilierte Version, die Leute aufrufen können (für diejenigen, die COM ablehnen): https: //gist.github.com/rdp/9748303 – rogerdpack

+0

Denken Sie daran, vor dem Aufruf von 'SHOpenFolderAndSelectItems (...)' 'CoInitializeEx (...)' aufzurufen und stellen Sie sicher, dass Sie alle Schrägstriche in Ihrem Pfad durch Backslashes ersetzen. Wenn Sie eines dieser beiden Dinge nicht tun, wird dies fehlschlagen. –

0

In dem Fall, den Sie beschrieben haben, wird im Dateifenster nur die Datei ausgewählt, wenn sie initialisiert wird und nicht aktiviert wird.

Obwohl dies sich wie ein Kludn fühlt, konnten Sie XP erkennen und nur für dieses Betriebssystem den Dialog mit seinem Handle schließen und einen neuen öffnen, um eine andere Datei mit zu tarnen.

2

Versuchen Sie die '/ n' Option. Dies öffnet jedoch einen neuen Ordner - vielleicht schon geöffnet. Zumindest ist die von Ihnen angegebene Datei ausgewählt.

/n,/select,<path_and_filename> 

SHOpenFolderAndSelectItems nicht immer in meinem Fall, und ich kann nicht herausfinden, warum. Übrigens müssen Sie vor dem Aufruf von CoInitialize/CoInitializeEx aufrufen.

+0

SHOpenFolderAndSelectItems für mich schlägt fehl, es sei denn, ich verwende einen perfekt formatierten vollständigen Pfad, wie c: \ dev – rogerdpack