如何用代码打开系统的“运行”对话框

如何用代码打开系统的“运行”对话框

这个问题我很早之前就知道了,但今天要用的时候,居然给忘了,查了好半天才搞出来,所以这里有必要记录一下,另外也可以了解一下COM的调用及C#4.0中的Dynamic Lookup。

所谓“运行”对话框,就是开始菜单里的那个运行,其快捷键为Windows+R,相信很多人都用过,我这里介绍三种方法来打开“运行”对话框:

一、模拟按键

由于.NET类库里的SendKeys类貌似不能发送Windows键,所以这里我使用Win32 API:keybd_event:

[DllImport("user32")]
public static extern void keybd_event(
 byte bVk,//按键的虚拟键码
 byte bScan,
 int dwFlags,//0表示按下,2表示抬起
 int dwExtraInfo
);

//模拟Windows+R

keybd_event(0x5B, 0, 0, 0);
keybd_event((byte)'R', 0, 0, 0);
keybd_event((byte)'R', 0, 2, 0);
keybd_event(0x5B, 0, 2, 0);

二、Shell32.dll里有一个未公开的API,无函数名,序号为61,其形式如下

        [DllImport("shell32",EntryPoint="#61",CharSet=CharSet.Unicode)]//#61代表序号为61的函数;字符集要设成Unicode,否则可能会是乱码
        public static extern void RunDialog(   //设定了EntryPoint之后,函数名可任取
            IntPtr hwndOwner,  //所有者窗口句柄
            IntPtr hIcon,   //要显示的图标句柄
            string lpstrDirectory, //“浏览”按钮的目录,该目录下的文件可省略路径
            string lpstrTitle,  //窗口标题的文字
            string lpstrDescription, //窗口上的文本描述
            uint uFlags   //样式
          );

另外,如果要在C++里用序号调用函数,请将MAKEINTRESOURCE( num )作为函数名传递给GetProcAddress函数。

三、Shell32.dll里有一个COM函数(这个dll里既有Win32 API,又有COM)FileRun,调用COM中的函数有两种方式,我分别给予介绍:
1.引用
该方式很简单,跟调用.NET函数差不多:
添加对shell32.dll的引用。
代码如下:
Shell32.Shell s = new Shell32.Shell();
s.FileRun();

实际上Shell32.Shell是个接口,之所以能够实例化,是因为它有一个Attribute:
CoClass(typeof(ShellClass))

所以也可以这样:

Shell32.ShellClass sc=new Shell32.ShellClass();
sc.FileRun();

不过这段代码在VS2010里编不过,估计是因为C#4.0里有个“内嵌类型”的概念。

2.反射
COM也可以反射,但是只限于调用,不能查询成员:

            Type t = Type.GetTypeFromProgID("Shell.Application");
            object obj = Activator.CreateInstance(t);
            t.InvokeMember("FileRun", BindingFlags.InvokeMethod, null, obj, null);

而如果在C#4.0里,由于有Dynamic Lookup的存在,可以这样:

            Type t = Type.GetTypeFromProgID("Shell.Application");
            dynamic obj = Activator.CreateInstance(t);
            obj.FileRun();

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值