WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数

简单来说就是实现一个程序A 打开程序B,并且在打开的时候传递一些参数给B,最后在B窗口上显示出参数,这个小功能也是折腾了我半天。现在把我的过程整理记录下来。

1.首先我们得有一个被调用的程序,新建一个简单的WPF程序,命名为:argTest。里面加一个label,用来显示接收到的参数。直接运行该程序如下:WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第1张图片

2.新建一个WPF程序用来启动我们的argTest.exe程序,命名为call。添加窗体load事件,在load里调用Process.Start()方法。如下

        private void wndLoad(object sender, RoutedEventArgs e)
        {
            string path = "D:\\Project\\WPF-TEST\\argTest\\argTest - 副本\\bin\\Debug\\argTest.exe";
            if (File.Exists(path))
            {
                Process.Start(path);
            }


        }



运行call程序,会弹出两个窗口,当然现在我们没有传递任何参数。

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第2张图片

3.其实要传参数很简单,只需要调用 Process Start(string fileName, string arguments)这函数即可,难就难在怎么去接收参数。网上百度一番基本做法是修改被调用程序(argTest.exe)的入口函数:

1> 添加新建类Program

2>添加全局变量,重载MainWindow的构造函数,以便传递参数


        string[] recArgs;

        public MainWindow(string[] args)
        {
            InitializeComponent();
            if (args.Length > 0)
            {
                recArgs = args;
            }
        }

3>手动添加带参数入口Main函数

        [STAThread]
        static void Main(string[] args)
        {
            argTest.App app = new App();
            MainWindow window = new MainWindow(args);
            app.MainWindow = window;
            app.InitializeComponent();
            app.Run();
        }

4>项目属性设置启动对象为argTest.Program

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第3张图片WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第4张图片

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第5张图片


WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第6张图片

4.在argTest项目添加load事件,在load事件里更改窗体上label的显示内容。

  private void wndLoad(object sender, RoutedEventArgs e)
        {

            msgLabel.Content = "接收到的参数是:";
            string temp = "";
            if (recArgs.Length > 0)
            {
                //拼接参数
                for (int i = 0; i < recArgs.Length; i++)
                {
                    temp += recArgs[i] + " ";
                }
                msgLabel.Content = msgLabel.Content + temp;
            }
5.将call程序中原来load函数里的   Process.Start(path); 替换为 Process.Start(path,"this is a test");

6.重新生成argTest后,运行call。你会发现参数依然没有传递到argTest窗体,这是为什么呢?(可以自己先做测试找问题)

   是没有调用我们重载的构造函数吗?

   在构造函数里添加Message.show(args[0]);你会发现是调用了构造函数的,且能打印出值“this”。说明参数是传递进去了,并且以空格区分参数。

   参数既然传递进去了,那为什么会在窗口上没有显示出来呢?去掉构造函数里的打印,我们再在load方法里打印recArgs的长度,居然没有打印出来,我们该了入口函数不会      连load函数也不进入了吧。直接MessageBox.Show(“进入load”);发现是会进入load的。为什么没有打印出recArgs的长度来呢? 把它放在try{}catch{} 里 你会发现recArgs居然      是报null错误,那么这里只可能是recArgs为null,在前面我们已经打印出来了  参数确实传递进来了,为什么recArgs还会为null呢?(你可以自己验证一下)

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第7张图片

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第8张图片WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第9张图片

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第10张图片

为了找到这个原因,在argTest程序里所有函数和变量均打上一个端点,直接运行,你会发现一个奇怪的问题默认构造函数也会被执行,全局变量会被定义两次。这就能解释为什么recArgs为null了。但为什么会执行两次呢?我在手动添加的入口函数里面增加断点单步执行,发现默认构造函数是在执行app.Run()的时候被调用的。查看官方文档,原来Run方法会调用 Application的OnStartup方法,在该方法中会再次调用MainWindow的默认构造函数。所以我们要继承Application类重写OnStartup方法。

namespace argTest
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            CustomApplication app = new CustomApplication();
            //MainWindow window = new MainWindow(args);
            //app.MainWindow = window;
            app.Run();
        }
    }
    class CustomApplication : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWindow window = new MainWindow(e.Args);
            window.Show();
        }
    }
}
现在直接运行  你会发现不会执行默认构造函数。  现在删除所有打印代码运行call程序就没有问题了

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第11张图片

WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数_第12张图片

完工


后面好像有码友说运行不出来  我从新整理了下 ,下载地址:http://download.csdn.net/download/u012046379/10184741

本来想设置0资源分下载,现在资源必须选择下载资源分。。。。。

你可能感兴趣的:(学习历程)