Sådan starter du Windows 'run' dialog fra C #

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil starte køredialogen (Windows + R) fra Windows i min C # -kode.


Jeg går ud fra, at det kan gøres ved hjælp af explorer.exe, men jeg er ikke sikker på hvordan.

Bedste reference


API'en RunFileDlg understøttes ikke og kan fjernes af Microsoft fra fremtidige versioner af Windows (jeg vil yde MS's forpligtelse til at bakkompatibilitet og det faktum, at denne API, selv om den ikke er dokumenteret, synes at være ret bredt kendt gør dette er usandsynligt, men det er stadig en mulighed).


Den understøttede måde at starte dialogboksen Kør, bruger IShellDispatch::FileRun metoden. [10]


I C # kan du få adgang til denne metode ved at gå til Tilføj Reference, vælg COM-fanen og vælg 'Microsoft Shell Controls and Automation'. Herefter kan du starte dialogboksen som følger:


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


Ja, API'en RunFileDlg tilbyder mere tilpassbarhed, men det har den fordel at blive dokumenteret, understøttet og derfor usandsynligt at bryde i fremtiden.

Andre referencer 1


Brug 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);
}


Mulige værdier for 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).


Se også Sådan åbnes programmatisk Kør c ++?

Andre referencer 2


En anden metode ville være at efterligne Windows + R-tastekombinationen.


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);
    }
}


og ring til:


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