此进程间通信不是等同于Linux下的进程间的发送与接收消息的通信,关于C#下的进程间通信我们可以有两种方式:
1.建立共同的区域(共享内存,文件,注册表,剪贴板等等)
2.使用WIN API函数。①使用Process在A进程内部启动另外的可执行文件并且以新的进程运行,而传递参数既可以通过可执行文件main函数的命令行参数,亦可以获取主窗口的句柄而后通过API函数发送消息;②利用API函数找到进程窗口的句柄,然后用API去控制这个窗口。例如:导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,然后进行消息传送。
本文主要介绍第二种方式,第一种方式相对比较复杂,而且效率不高。
一、需要的头文件
进程的启动需要System.Diagnostics;
API函数的使用需要System.Runtime.InteropServices;此外需要在使用API函数的类中对所应用的函数进行声明:
- [DllImport("User32.dll", EntryPoint = "SendMessage")]
- private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
- [DllImport("User32.dll", EntryPoint = "FindWindow")]
- private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
- [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
- private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
二、实例源码
1.简单的传递参数进程启动
介绍4种方法:
①启动外部程序,不等待其退出
②启动外部程序,等待其退出
③启动外部程序,无限等待其退出
④启动外部程序,通过事件监视其退出
=================================================
①启动外部程序,不等待其退出
- Process pro = new Process();
pro.StartInfo.FileName = @"F:\Projects\QueryTest\QueryTest\bin\Debug\QueryTest.exe";
- pro.StartInfo.Arguments = string.Format("{0} {1} {2} {3}", XX, XX, XX, XX);
- //Console.WriteLine("外部进程开始启动。。");
- Console.WriteLine("QueryTest开始启动。。");
- pro.Start();
②启动外部程序,等待其退出
- Process pro = new Process();
- pro.StartInfo.FileName = @"F:\Projects\QueryTest\QueryTest\bin\Debug\QueryTest.exe";
- pro.StartInfo.Arguments = string.Format("{0} {1} {2} {3}", XX, XX, XX, XX);
- //Console.WriteLine("外部进程开始启动。。");
- Console.WriteLine("QueryTest开始启动。。");
- pro.Start();
- if (proc != null)
- {
- proc.WaitForExit(3000);
- if (proc.Ha***ited)
- Console.WriteLine("XXXXX");
- else
- {
- // 如果外部程序没有结束运行则强行终止之。
- proc.Kill();
- Console.WriteLine("XXXXX1");
- }
- }
③启动外部程序,无限等待其退出 //有时候看不见第一个进程的反应,可能是忘记了添加Console.Read()或者是其他的是控制台等待的方法。
- static void Main(string[] args)
- {
- //for (int i = 0; i < 5; i++)
- //{
- //string usrName = "usr" + i;
- //string cipher = usrName;
- string srvIP = "10.25.18.68";
- string srvPort = "2030";
- Process pro = new Process();
- //pro.StartInfo.FileName = "F:\\EC\\enterpriseInternalCommunication0406-0410\\enterpriseInternalCommunication\\bin\\Debug\\enterpriseInternalCommunication.exe";
- pro.StartInfo.FileName = @"F:\Projects\QueryTest\QueryTest\bin\Debug\QueryTest.exe";
- //pro.StartInfo.Arguments = string.Format("{0} {1} {2} {3}", usrName, cipher, srvIP, srvPort);
- //Console.WriteLine("进程{0}开始启动。。", i);
- Console.WriteLine("QueryTest开始启动。。");
- pro.Start();
- if (pro != null)
- {
- pro.WaitForExit();
- }
④启动外部程序,通过事件监视其退出
- static void Main(string[] args)
- {
- //for (int i = 0; i < 5; i++)
- //{
- //string usrName = "usr" + i;
- //string cipher = usrName;
- string srvIP = "10.25.18.68";
- string srvPort = "2030";
- Process pro = new Process();
- //pro.StartInfo.FileName = "F:\\EC\\enterpriseInternalCommunication0406-0410\\enterpriseInternalCommunication\\bin\\Debug\\enterpriseInternalCommunication.exe";
- pro.StartInfo.FileName = @"F:\Projects\QueryTest\QueryTest\bin\Debug\QueryTest.exe";
- //pro.StartInfo.Arguments = string.Format("{0} {1} {2} {3}", usrName, cipher, srvIP, srvPort);
- //Console.WriteLine("进程{0}开始启动。。", i);
- Console.WriteLine("QueryTest开始启动。。");
- pro.Start();
- if (pro != null)
- {
- //监视进程退出
- pro.EnableRaisingEvents = true;
- //指定退出事件方法
- pro.Exited += new EventHandler(pro_Exited);
- }
- Console.Read();
- }
- static void pro_Exited(object sender, EventArgs e)
- {
- Console.WriteLine("启动的外部程序退出");
- }
2.API函数传递参数
未完待续。。。。。
阅读(1563) | 评论(0) | 转发(0) |