一、進程間通訊的方式
進程間通訊的方式有很多,常用的有共享內存(內存映射文件、共享內存DLL、剪切板等)、命名管道和匿名管道、發送消息等幾種方法來直接完成,另外還可以通過socket口、配置文件和注冊表等來間接實現進程間數據通訊任務。以上這幾種方法各有優缺點,具體到在進程間進行大數據量數據的快速交換問題上,則可以排除使用配置文件和注冊表的方法;另外,由於管道和socket套接字的使用需要有網卡的支持,因此也可以不予考慮。這樣,可供選擇的通訊方式只剩下共享內存和發送消息兩種。
二、發送消息實現進程間通訊前准備
下面的例子用到一個windows api 32函數
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);
要有此函數,需要添加using System.Runtime.InteropServices;命名空間
此方法各個參數表示的意義
wnd:接收消息的窗口的句柄。如果此參數為HWND_BROADCAST,則消息將被發送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發送到子窗口。
msg:指定被發送的消息類型。
wP:消息內容。
lP:指定附加的消息指定信息。
用api參考手冊查看SendMessage用法時,參考手冊則提示
SendMessage與PostMessage之間的區別:SendMessage和PostMessage,這兩個函數雖然功能非常相似,都是負責向指定的窗口發送消息,但是SendMessage() 函數發出消息后一直等到接收方的消息響應函數處理完之后才能返回,並能夠得到返回值,在此期間發送方程序將被阻塞,SendMessage() 后面的語句不能被繼續執行,即是說此方法是同步的。而PostMessage() 函數在發出消息后馬上返回,其后語句能夠被立即執行,但是無法獲取接收方的消息處理返回值,即是說此方法是異步的。
三、發送消息實現進程間通訊具體步驟
1.新建windows應用程序
(1)打開VS2008,新建一個“windows 應用程序”,主窗口為Form1,項目名稱:ProcessCommunication
(2)在Form1上添加一個標簽為textBox1的文本框,並為Form1添加KeyDown事件,當Form1接收到KewDown消息時,將接收到的數據顯示在label1上。
public Form1()
{
InitializeComponent();
this.KeyDown+=new KeyEventHandler(Form1_KeyDown);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
this.textBox1.Text = Convert.ToString(e.KeyValue);
}
(3)編譯運行,生成ProcessCommunication.exe
2.新建windows應用程序
(1)打開VS2008,新建一個“windows 應用程序”,主窗口為Form1,項目名稱:ProcessCommunication1,
並在Form1上添加一個按鈕和一個文本框
namespace ProcessCommunication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Win32 API函數:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
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); //獲取文本框數據
SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //點擊該按鈕,以文本框數據為參數,向Form1發送WM_KEYDOWN消息
}
}
}
}
}
3.啟動ProcessCommunication.exe可執行文件,彈出Form1窗體稱為接受消息窗體。
啟動ProcessCommunication1.exe可執行文件,在彈出的窗體中的文本框中輸入任意數字,點擊button1按鈕,接受消息窗體textBox1即顯示該數字。
到此結束。
注意,這里的啟動不是指通過VS調試啟動,而是通過雙擊exe啟動,因為通過VS調試啟動,生成的進程名稱並不是
“ProcessCommunication”