進程間通訊
一列牺、進程間通訊的方式進程間通訊的方式有很多,常用的有共享內(nèi)存(內(nèi)存映射文件划纽、共享內(nèi)存DLL脆侮、剪切板等)、命名管道和匿名管道勇劣、發(fā)送消息等幾種方法來直接完成靖避,另外還可以通過socket口、配置文件和注冊表等來間接實現(xiàn)進程間數(shù)據(jù)通訊任務比默。以上這幾種方法各有優(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ù)雖然功能非常相似轧葛,都是負責向指定的窗口發(fā)送消息搂抒,但是SendMessage()?函數(shù)發(fā)出消息后一直等到接收方的消息響應函數(shù)處理完之后才能返回,并能夠得到返回值尿扯,在此期間發(fā)送方程序?qū)⒈蛔枞缶В琒endMessage()?后面的語句不能被繼續(xù)執(zhí)行,即是說此方法是同步的衷笋。而PostMessage()?函數(shù)在發(fā)出消息后馬上返回芳杏,其后語句能夠被立即執(zhí)行,但是無法獲取接收方的消息處理返回值辟宗,即是說此方法是異步的爵赵。三、發(fā)送消息實現(xiàn)進程間通訊具體步驟1.新建windows應用程序(1)打開VS2008泊脐,新建一個“windows 應用程序”空幻,主窗口為Form1,項目名稱:ProcessCommunication(2)在Form1上添加一個標簽為textBox1的文本框容客,并為Form1添加KeyDown事件秕铛,當Form1接收到KewDown消息時,將接收到的數(shù)據(jù)顯示在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.exe2.新建windows應用程序??(1)打開VS2008,新建一個“windows 應用程序”供置,主窗口為Form1谨湘,項目名稱:ProcessCommunication1,并在Form1上添加一個按鈕和一個文本框namespace ProcessCommunication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}//Win32 API函數(shù):[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); //獲取文本框數(shù)據(jù)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é)束诱鞠。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門汛闸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝙茶,“玉大人,你說我怎么就攤上這事诸老÷『唬” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵别伏,是天一觀的道長蹄衷。 經(jīng)常有香客問我,道長畸肆,這世上最難降的妖魔是什么宦芦? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮轴脐,結(jié)果婚禮上调卑,老公的妹妹穿的比我還像新娘。我一直安慰自己大咱,他們只是感情好恬涧,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碴巾,像睡著了一般溯捆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厦瓢,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夹姥!你這毒婦竟也來了杉武?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布秘血,位于F島的核電站味抖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灰粮。R本人自食惡果不足惜仔涩,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粘舟。 院中可真熱鬧熔脂,春花似錦、人聲如沸柑肴。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽晰骑。三九已至适秩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕舆,已是汗流浹背秽荞。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 管道### 【11 章中刊咳,我們看到一種在兩個進程間發(fā)送消息的非常簡單的方法: 使用信號;我們創(chuàng)建通知事件儡司,通過它引...
- android進程間通訊(3)–使用Socket 前言:本文記錄android進程間通訊的另一種通訊方式–Sock...
- 平時一說進程間通訊娱挨,大家都會想到AIDL,其實messenger和AIDL作用一樣捕犬,都可以進行進程間通訊跷坝。它是基于...
- 寫tweak的時候酵镜,經(jīng)常需要tweak進程間通訊。因為hook的應用經(jīng)常都是在沙盒里的柴钻,如果需要操作沙盒外的文件淮韭,...
- 淺談Android進程間通訊(Binder) 進程間通訊IPC不是Android中所特有的,任何一個操作系統(tǒng)需要相...