2011-01-18 16 views
11

¿Hay alguna manera simple de abrir el cuadro de diálogo "Abrir con"?¿Cómo puedo mostrar el cuadro de diálogo "Abrir con"?

+4

¿Winforms? WPF? ¿Formas web? MVC? – Oded

+0

CodeProject tiene un artículo que ocupa el primer lugar al buscar en Google: http://www.codeproject.com/KB/shell/openwith.aspx. Sin embargo, me gustaría ver una forma más bonita de hacer esto, en lugar de recurrir a externos ('ProcessStartInfo', ¿no?). –

+2

http://stackoverflow.com/a/32153874/5306861 – codeDom

Respuesta

9

Esto debería hacer el truco ...

var processInfo = new ProcessStartInfo(fileName); 
processInfo.Verb = "openas"; 
Process.Start(processInfo); 

Aunque, Oded hace un gran punto - no saber exactamente cómo/dónde se va a utilizar dicha funcionalidad significa esto podría no ser la respuesta para su situación .

Comentarios recientes sobre esta respuesta van a mostrar que no estaba muy detallado en primer lugar. Se producirá un problema si intentas openas un archivo que ya tiene el verbo open definido en ese tipo de archivo. Del mismo modo, si intentas open un archivo que no tiene ese verbo definido, habrá problemas. La cuestión sería:

Win32Exception: No hay ninguna aplicación asociada con el archivo especificado para esta operación

De la parte superior de mi cabeza he sugerido a Tomás que con el fin de utilizar este tipo de código en una aplicación de producción que necesitaría ser minuciosa y tal vez verificar el registro, o averiguar si un archivo puede y debe abrirse con cualquier verbo determinado. Podría ser más simple que eso cuando considere ProcessStartInfo.Verbs: una vez que se configure fileName, le proporcionará una colección de posibles verbos asociados con el tipo de archivo. Esto debería facilitar la determinación de qué hacer con qué archivo.

Para concluir, como mencioné a Thomas, deberá tener cuidado y agregar algo de complejidad/inteligencia a su aplicación; esta respuesta ciertamente no es una solución general.

+1

No funciona ... Win32Exception, "No hay ninguna aplicación asociada con el archivo especificado para esta operación" –

+0

@ThomasLevesque Solo funcionará si no hay "programas predeterminados" están definidos; es decir, si hay un 'Abrir con ...'menú contextual para el archivo, entonces esto fallará. Si se trata de un tipo de archivo desconocido con simplemente una opción 'Abrir', esto funcionará. Lo contrario también es cierto: al usar el verbo 'open' para los tipos de archivos conocidos se ejecutará el programa predeterminado pero se alterará esta misma excepción si se desconoce. Por lo tanto, en una aplicación adecuada, debes ser cuidadoso al respecto; tal vez haciendo una búsqueda en el repositorio de tipos de archivo conocido (registro) y basando su decisión de cómo abrir los hechos dados por el sistema. –

+0

@ThomasLevesque De hecho, ni siquiera necesita ir a tales longitudes: ['ProcessStartInfo.Verbs'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.verbs (VS.90) .aspx) se rellenará con los posibles verbos para un archivo cuando se establezca 'fileName', lo que significa que puede verificar si el verbo' open' está definido y si no usa 'openas'. Esto no atrapa todos los casos que apuesto, así que agrega tu propia inteligencia a voluntad. –

2

Usando

System.Diagnostics.Process.Start(path); 

El archivo se openened con el programa por defecto, si no se programa por defecto se define el diálogo abierto con será mostrado.

Usted puede usar la función:

[DllImport("shell32.dll", SetLastError = true)] 
extern public static bool 
     ShellExecuteEx(ref ShellExecuteInfo lpExecInfo); 

Tienes un ejemplo para utilizar esta función: this link

18

Algunos ingeniería inversa con procexp reveló una línea de comandos rundll32.exe que funcionó. Aquí está un ejemplo de programa que lo utiliza:

using System; 
using System.Diagnostics; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
     ShowOpenWithDialog(@"c:\temp\test.txt"); 
    } 
    public static void ShowOpenWithDialog(string path) { 
     var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"); 
     args += ",OpenAs_RunDLL " + path; 
     Process.Start("rundll32.exe", args); 
    } 
} 

Probado en Win7, no puede adivinar lo bien que funciona en otras versiones de Windows.

+0

Gracias @Hans! Estuve dando vueltas por un tiempo y esto es lo que necesitaba. No estaba usando la ruta completa de shell32.dll. – tehDorf

+0

Tenga en cuenta que 'OpenAs_RunDLL' no está documentado y [no siempre funciona.] (Http://stackoverflow.com/questions/23566667/rundll32-shell32-dll) –

Cuestiones relacionadas