如何启动窗口“;运行“;对话框

本文关键字:运行 对话框 窗口 何启动 启动 | 更新日期: 2023-09-27 18:24:55

我想在C#代码中从Windows启动运行对话框(Windows+R)。

我想这可以使用explorer.exe来完成,但我不确定如何完成。

如何启动窗口“;运行“;对话框

使用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++?

RunFileDlg API不受支持,Microsoft可能会将其从未来版本的Windows中删除(我同意MS对向后兼容性的承诺,而且这个API虽然没有文档,但似乎相当广为人知,这使得这种情况不太可能发生,但这仍然是可能的)。

支持的启动运行对话框的方法是使用IShellDispatch::FileRun方法。

在C#中,您可以访问此方法,方法是转到"添加引用",选择"COM"选项卡,然后选择"Microsoft Shell Controls and Automation"。完成此操作后,您可以按如下方式启动对话框:

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

是的,RunFileDlg API提供了更多的可定制性,但它具有文档化、受支持的优点,因此在未来不太可能出现故障。

请注意,Shell32必须在STA线程上运行。如果您的代码中出现异常,请在方法声明上方添加[STAThread],如下所示,例如:

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

任何调用使用Shell32的方法的方法也应该在STA线程上运行。

另一种方法是模拟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);