轉自Net-Spider原文 c# 進程間通訊html
1、進程間通信的方式c#
進程間通信的方式有不少,經常使用的有共享內存(內存映射文件、共享內存DLL、剪切板等)、命名管道和匿名管道、發送消息等幾種方法來直接完成,另外還能夠經過socket口、配置文件和註冊表等來間接實現進程間數據通信任務。以上這幾種方法各有優缺點,具體到在進程間進行大數據量數據的快速交換問題上,則能夠排除使用配置文件和註冊表的方法;另外,因爲管道和socket套接字的使用須要有網卡的支持,所以也能夠不予考慮。這樣,可供選擇的通信方式只剩下共享內存和發送消息兩種。windows
2、發送消息實現進程間通信前準備api
下面的例子用到一個windows api 32函數異步
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);socket
要有此函數,須要添加using System.Runtime.InteropServices;命名空間ide
此方法各個參數表示的意義函數
wnd:接收消息的窗口的句柄。若是此參數爲HWND_BROADCAST,則消息將被髮送到系統中全部頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被髮送到子窗口。post
msg:指定被髮送的消息類型。大數據
wP:消息內容。
lP:指定附加的消息指定信息。
用api參考手冊查看SendMessage用法時,參考手冊則提示
SendMessage與PostMessage之間的區別:SendMessage和PostMessage,這兩個函數雖然功能很是類似,都是負責向指定的窗口發送消息,
SendMessage() 函數發出消息後一直等到接收方的消息響應函數處理完以後才能返回,並可以獲得返回值,在此期間發送方程序將被阻塞,SendMessage() 後面的語句不能被繼續執行,便是說此方法是同步的。
PostMessage() 函數在發出消息後立刻返回,其後語句可以被當即執行,可是沒法獲取接收方的消息處理返回值,便是說此方法是異步的。
3、發送消息實現進程間通信具體步驟
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即顯示該數字。
到此結束。