简单来说就是实现一个程序A 打开程序B,并且在打开的时候传递一些参数给B,最后在B窗口上显示出参数,这个小功能也是折腾了我半天。现在把我的过程整理记录下来。
1.首先我们得有一个被调用的程序,新建一个简单的WPF程序,命名为:argTest。里面加一个label,用来显示接收到的参数。直接运行该程序如下:
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);
}
}
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
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呢?(你可以自己验证一下)
为了找到这个原因,在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程序就没有问题了
完工
后面好像有码友说运行不出来 我从新整理了下 ,下载地址:http://download.csdn.net/download/u012046379/10184741
本来想设置0资源分下载,现在资源必须选择下载资源分。。。。。