C# 進程間通訊
一、進程間通訊的方式
1)共享內(nèi)存
包括:內(nèi)存映射文件,共享內(nèi)存DLL,剪切板。
2)命名管道及匿名管道
3)消息通訊
4)利用代理方法。例如SOCKET,配置文件,注冊表方式。
等方式。
方法一:通訊。
進程間通訊的方式有很多,常用的有共享內(nèi)存(內(nèi)存映射文件、共享內(nèi)存DLL、剪切板等)、命名管道和匿名管道、發(fā)送消息等幾種方法來直接完成,另外還可以通過socket口、配置文件和注冊表等來間接實現(xiàn)進程間數(shù)據(jù)通訊任務(wù)。以上這幾種方法各有優(yōu)缺點,具體到在進程間進行大數(shù)據(jù)量數(shù)據(jù)的快速交換問題上,則可以排除使用配置文件和注冊表的方法;另外,由于管道和socket套接字的使用需要有網(wǎng)卡的支持,因此也可以不予考慮。這樣,可供選擇的通訊方式只剩下共享內(nèi)存和發(fā)送消息兩種。
二、發(fā)送消息實現(xiàn)進程間通訊前準備
下面的例子用到一個windows api 32函數(shù)
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);
要有此函數(shù),需要添加using System.Runtime.InteropServices;命名空間
此方法各個參數(shù)表示的意義
wnd:接收消息的窗口的句柄。如果此參數(shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。
msg:指定被發(fā)送的消息類型。
wP:消息內(nèi)容。
lP:指定附加的消息指定信息。
用api參考手冊查看SendMessage用法時,參考手冊則提示
SendMessage與PostMessage之間的區(qū)別:SendMessage和PostMessage,這兩個函數(shù)雖然功能非常相似,都是負責(zé)向指定的窗口發(fā)送消息,但是SendMessage()?函數(shù)發(fā)出消息后一直等到接收方的消息響應(yīng)函數(shù)處理完之后才能返回,并能夠得到返回值,在此期間發(fā)送方程序?qū)⒈蛔枞?,SendMessage()?后面的語句不能被繼續(xù)執(zhí)行,即是說此方法是同步的。而PostMessage()?函數(shù)在發(fā)出消息后馬上返回,其后語句能夠被立即執(zhí)行,但是無法獲取接收方的消息處理返回值,即是說此方法是異步的。
三、發(fā)送消息實現(xiàn)進程間通訊具體步驟
1.新建windows應(yīng)用程序
(1)打開VS2008,新建一個“windows 應(yīng)用程序”,主窗口為Form1,項目名稱:ProcessCommunication
(2)在Form1上添加一個標簽為textBox1的文本框,并為Form1添加KeyDown事件,當(dāng)Form1接收到KewDown消息時,將接收到的數(shù)據(jù)顯示在textBox1上。
using System;using System.Windows.Forms;namespace ProcessCommunication{public partial class Form1 : Form{public Form1(){InitializeComponent();this.KeyDown += new KeyEventHandler(Form1_KeyDown);}private void Form1_KeyDown(object sender, KeyEventArgs e){//IntPtr p = new IntPtr(e.KeyValue);//string ss = Marshal.PtrToStringAnsi(p);this.textBox1.Text = Convert.ToString(e.KeyValue);//this.textBox1.Text = ss;}}}
(3)編譯運行,生成ProcessCommunication.exe
2.新建windows應(yīng)用程序
?
?
(1)打開VS2008,新建一個“windows 應(yīng)用程序”,主窗口為Form1,項目名稱:ProcessCommunication1,
并在Form1上添加一個按鈕和一個文本框
using System;using System.Diagnostics;using System.Runtime.InteropServices;using System.Windows.Forms;namespace ProcessCommunication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}//Win32 API函數(shù):[]private static extern int SendMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP);private void button1_Click(object sender, EventArgs e){Process[] pros = Process.GetProcesses(); //獲取本機所有進程for (int i = 0; i < pros.Length; i++){if (pros[i].ProcessName == "ProcessCommunication") //名稱為ProcessCommunication的進程{IntPtr hWnd = pros[i].MainWindowHandle; //獲取ProcessCommunication.exe主窗口句柄int data = Convert.ToInt32(this.textBox1.Text); //獲取文本框數(shù)據(jù)//String str = this.textBox1.Text; //獲取文本框數(shù)據(jù)//IntPtr data = Marshal.StringToHGlobalAnsi(str);SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //點擊該按鈕,以文本框數(shù)據(jù)為參數(shù),向Form1發(fā)送WM_KEYDOWN消息}}}}}
3.啟動ProcessCommunication.exe可執(zhí)行文件,彈出Form1窗體稱為接受消息窗體。
啟動ProcessCommunication1.exe可執(zhí)行文件,在彈出的窗體中的文本框中輸入任意數(shù)字,點擊button1按鈕,接受消息窗體textBox1即顯示該數(shù)字。
到此結(jié)束。

