Как запустить диалог запуска Windows из C # - PullRequest
9 голосов
/ 17 февраля 2012

Я хочу запустить диалоговое окно запуска (Windows + R) из Windows в моем коде C #.

Я предполагаю, что это можно сделать с помощью explorer.exe, но я не знаю, как.

Ответы [ 3 ]

9 голосов
/ 17 февраля 2012

Использовать 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);
}

Возможные значения для 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).

См. Также Как программно открыть Run c ++?

7 голосов
/ 17 февраля 2012

API RunFileDlg не поддерживается и может быть удален Microsoft из будущих версий Windows (я признаю, что MS привержена обратной совместимости, и тот факт, что этот API, хотя и не документирован, кажется достаточно широко известным, делает это маловероятно, но это все еще возможно).

Поддерживаемый способ запуска диалогового окна запуска - метод IShellDispatch::FileRun.

В C # вы можете получить доступ к этому методу, перейдя в Add Reference, выберите вкладку COM и выберите «Microsoft Shell Controls and Automation». После этого вы можете запустить диалог следующим образом:

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

Да, API RunFileDlg предлагает больше возможностей настройки, но имеет то преимущество, что оно документировано, поддерживается и поэтому вряд ли сломается в будущем.

Обратите внимание, что Shell32 должен быть запущен в потоке STA. Если вы получили исключение в своем коде, добавьте [STAThread] над объявлением вашего метода, например:

    [STAThread]
    private static void OpenRun() {
        //Shell32 code here
    }

Любой метод, вызывающий метод, использующий Shell32, также должен запускаться в потоке STA.

2 голосов
/ 17 февраля 2012

Другим способом было бы эмулировать комбинацию клавиш 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);
    }
}

и звоните:

KeyboardSend.KeyDown(Keys.LWin);
KeyboardSend.KeyDown(Keys.R);
KeyboardSend.KeyUp(Keys.R);
KeyboardSend.KeyUp(Keys.LWin);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...