2010-06-09 20 views
17

En mi aplicación puedo programación explorador abierto y seleccione un archivo usando el siguiente código:seleccionar mediante programación archivo en el Explorador

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

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

Mi problema es que si llamo a esta función por segunda vez con un archivo diferente, pero en la misma carpeta, la selección en el explorador no cambia al nuevo archivo, sino que permanece en el archivo anterior.

Por ejemplo, si llamo a mi función con C:\path\to\file1.txt, se abrirá una nueva ventana del explorador y se seleccionará file1.txt. Si llamo a mi función por segunda vez con C:\path\to\file2.txt, se activará la ventana del explorador existente, pero la selección seguirá estando en file1.txt.

¿Hay alguna manera de forzar al explorador a actualizar la selección o una forma mejor de lograr esto?

EDIT:

El comportamiento mencionado anteriormente era en Windows XP. Parece que el comportamiento en Vista/Win7 es diferente. Cada llamada abrirá una nueva instancia de explorador y seleccionará el archivo.

Mi objetivo principal es replicar la opción de Visual Studio a Abrir carpeta que contiene de un documento. Esta característica en Visual Studio se comporta de la misma manera en XP, Vista y Win7. No creará una nueva instancia si ya está abierta otra instancia con la misma carpeta, pero actualizará la selección al nuevo archivo.

Si alguien sabe cómo Visual Studio logra esto, me gustaría saberlo.

+0

No veo este comportamiento en Windows 7 x64. Dos ventanas se abren correctamente, cada una con el archivo correcto seleccionado. –

+0

Tiene razón, el comportamiento en Vista y Win 7 es diferente. He actualizado mi pregunta para mencionar esto. – flashk

+0

http://stackoverflow.com/questions/4831101/how-to-re-use-existing-already-opened-windows-explorer-window-to-launch-explorer y http://stackoverflow.com/questions/8182494/how-can-i-set-an-existing-explorer-exe-instance-to-select-a-file related related ... – rogerdpack

Respuesta

25

Encontré la respuesta a mi pregunta. Necesito usar la función de shell SHOpenFolderAndSelectItems. Aquí está el código de la función si alguien está siempre interesada:

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

aparece chromium utiliza esto, también, ver http://src.chromium.org /svn/trunk/src/chrome/browser/platform_util_win.cc – rogerdpack

+0

Aquí hay una versión compilada en binario a la que las personas pueden llamar (para aquellos que no están de acuerdo con COM): https: //gist.github.com/rdp/9748303 – rogerdpack

+0

Recuerde llamar a 'CoInitializeEx (...)' antes de llamar a 'SHOpenFolderAndSelectItems (...)', y asegúrese de reemplazar todos los forwardslashes en su ruta con barras diagonales inversas. Si no se hace cualquiera de estas dos cosas, se producirá un error. –

0

En el caso que describió, la ventana de archivos solo selecciona el archivo cuando se inicializa en lugar de cuando se activa.

Aunque esto se siente como un error, puede detectar XP y solo para ese sistema operativo, cierre el cuadro de diálogo usando su manejador y abra uno nuevo para dirigir otro archivo.

2

pruebe la opción '/ n'. Sin embargo, esto abrirá una nueva carpeta, quizás ya abierta. Pero, al menos, el archivo que especifique está seleccionado.

/n,/select,<path_and_filename> 

SHOpenFolderAndSelectItems siempre falla en mi caso y no puedo entender por qué. Por cierto, debe llamar a CoInitialize/CoInitializeEx antes de llamar a este.

+0

SHOpenFolderAndSelectItems falla a menos que use una ruta completa perfectamente formateada, como c: \ dev – rogerdpack

Cuestiones relacionadas