2012-02-17 17 views
7

Quiero iniciar el diálogo de ejecución (Windows + R) desde Windows dentro de mi código C#.Cómo iniciar el diálogo "ejecutar" Windows desde C#

Supongo que esto se puede hacer utilizando explorer.exe, pero no estoy seguro de cómo.

+5

¿Hay alguna razón desea que el cuadro "Ejecutar" en lugar de iniciar el proceso directamente a través Process.Start? –

+11

Tengo una muy fuerte sospecha de que esta es una pregunta "[¿Una botella o una botella?] (Http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx)". –

+1

Entiendo que desea iniciar el comando "Ejecutar" proporcionado por el Explorador de Windows. ¿Puedes explicar por qué quieres hacer esto? –

Respuesta

5

La API RunFileDlg no es compatible y puede eliminarse por Microsoft de versiones futuras de Windows (Otorgaré el compromiso de MS a la compatibilidad con versiones anteriores y al hecho de que esta API, aunque no documentada, ap las peras que se conocen bastante ampliamente lo hacen improbable, pero aún así es posible).

La forma compatible para iniciar el diálogo de ejecución es usar el método IShellDispatch::FileRun.

En C#, puede acceder a este método yendo a Agregar referencia, seleccione la pestaña COM y seleccione "Microsoft Shell Controls and Automation". Después de hacer esto, puede iniciar el diálogo de la siguiente manera:

Shell32.Shell shell = new Shell32.Shell(); 
shell.FileRun(); 

Sí, el API RunFileDlg ofrece más capacidad de personalización, pero esto tiene la ventaja de estar documentado, con el apoyo, y por lo tanto poco probable que romper en el futuro.

+0

Solución perfecta. – BlueM

+0

¿Es posible pasar un argumento (el comando para ejecutar)? – xr280xr

9

Uso RunFileDlg:

[DllImport("shell32.dll", EntryPoint = "#61", CharSet = CharSet.Unicode)] 
public static extern int RunFileDlg(
    [In] IntPtr hWnd, 
    [In] IntPtr icon, 
    [In] string path, 
    [In] string title, 
    [In] string prompt, 
    [In] uint flags); 

private static void Main(string[] args) 
{ 
    // You might also want to add title, window handle...etc. 
    RunFileDlg(IntPtr.Zero, IntPtr.Zero, null, null, null, 0); 
} 

Los valores posibles para flags:

RFF_NOBROWSE = 1; //Removes the browse button. 
RFF_NODEFAULT = 2; // No default item selected. 
RFF_CALCDIRECTORY = 4; // Calculates the working directory from the file name. 
RFF_NOLABEL = 8; // Removes the edit box label. 
RFF_NOSEPARATEMEM = 14; // Removes the Separate Memory Space check box (Windows NT only). 

Ver también How to programmatically open Run c++?

+0

¡agradable! gracias :) – cyptus

+0

Tenga en cuenta que técnicamente esto no está documentado – Justin

+0

¿Es esta una llamada no documentada? No pude encontrar ninguna referencia a esto en MSDN o en http://pinvoke.net –

2

Otro método sería emular la combinación de teclas de Windows + R.

using System.Runtime.InteropServices; 
using System.Windows.Forms; 

static class KeyboardSend 
{ 
    [DllImport("user32.dll")] 
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

    private const int KEYEVENTF_EXTENDEDKEY = 1; 
    private const int KEYEVENTF_KEYUP = 2; 

    public static void KeyDown(Keys vKey) 
    { 
     keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0); 
    } 

    public static void KeyUp(Keys vKey) 
    { 
     keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); 
    } 
} 

y llame:

KeyboardSend.KeyDown(Keys.LWin); 
KeyboardSend.KeyDown(Keys.R); 
KeyboardSend.KeyUp(Keys.R); 
KeyboardSend.KeyUp(Keys.LWin); 
Cuestiones relacionadas