2012-02-17 21 views
7

Tôi muốn bắt đầu hộp thoại chạy (Windows + R) từ Windows trong mã C# của tôi.Cách khởi động hộp thoại "chạy" từ C#

Tôi cho rằng điều này có thể được thực hiện bằng explorer.exe nhưng tôi không chắc chắn cách thực hiện.

+5

Có một lý do bạn muốn "Run" hộp thay vì bắt đầu quá trình trực tiếp thông qua Process.Start? –

+11

Tôi có một nghi ngờ rất mạnh rằng đây là câu hỏi "[Giày hoặc Chai?] (Http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx)". –

+1

Tôi hiểu rằng bạn muốn kích hoạt lệnh "Chạy" do Windows Explorer cung cấp. Bạn có thể giải thích tại sao bạn muốn làm điều này? –

Trả lời

5

Các RunFileDlg API không được hỗ trợ và có thể được gỡ bỏ bởi Microsoft từ các phiên bản tương lai của Windows (Tôi sẽ cho rằng cam kết của MS về khả năng tương thích ngược và thực tế là API này, mặc dù không có giấy tờ, ap lê được khá phổ biến làm cho điều này không, nhưng nó vẫn là một khả năng).

Cách được hỗ trợ để khởi chạy hộp thoại chạy là sử dụng phương thức IShellDispatch::FileRun.

Trong C#, bạn có thể truy cập phương pháp này bằng cách vào Thêm tham chiếu, chọn tab COM và chọn "Microsoft Shell Controls and Automation". Sau khi thực hiện điều này, bạn có thể khởi chạy hộp thoại như sau:

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

Vâng, RunFileDlg API cung cấp tùy biến nhiều hơn, nhưng điều này có lợi thế là được ghi nhận, hỗ trợ, và do đó khó có thể phá vỡ trong tương lai.

+0

Giải pháp hoàn hảo. – BlueM

+0

Có thể vượt qua một đối số (lệnh để chạy) không? – xr280xr

9

Sử dụng 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); 
} 

Giá trị có thể cho 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). 

Xem thêm How to programmatically open Run c++?

+0

đẹp! thanks :) – cyptus

+0

Lưu ý rằng về mặt kỹ thuật, điều này là không có giấy tờ – Justin

+0

Đây có phải là cuộc gọi không có giấy tờ không? Tôi không thể tìm thấy bất kỳ refrence này trên MSDN hoặc trên http://pinvoke.net –

2

Một phương pháp khác là giả lập tổ hợp phím 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); 
    } 
} 

và gọi:

KeyboardSend.KeyDown(Keys.LWin); 
KeyboardSend.KeyDown(Keys.R); 
KeyboardSend.KeyUp(Keys.R); 
KeyboardSend.KeyUp(Keys.LWin); 
Các vấn đề liên quan