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.
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.
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.
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).
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ó 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? –
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)". –
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? –