我想在我的C#代码中从Windows启动运行对话框(Windows + R)。
我认为这可以使用explorer.exe完成,但我不确定如何。
答案 0 :(得分:9)
使用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).
答案 1 :(得分:6)
Microsoft RunFileDlg
API不受支持,Microsoft可能会从未来版本的Windows中删除(我将授予MS对向后兼容性的承诺以及此API虽然没有记录,但似乎相当广为人知这不太可能,但它仍然是可能的。)
启动运行对话框的支持方式是使用IShellDispatch::FileRun
方法。
在C#中,您可以通过转到“添加引用”,选择“COM”选项卡,然后选择“Microsoft Shell控件和自动化”来访问此方法。完成此操作后,您可以按如下方式启动对话框:
Shell32.Shell shell = new Shell32.Shell();
shell.FileRun();
是的,RunFileDlg
API提供了更多可自定义功能,但这样做的好处是可以记录,支持,因此将来不太可能破解。
答案 2 :(得分:2)
另一种方法是模拟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);