C#使用SendMessage實(shí)現(xiàn)進(jìn)程間通信的方法
本文實(shí)例講述了C#使用SendMessage實(shí)現(xiàn)進(jìn)程間通信的方法。分享給大家供大家參考。具體分析如下:
為了深入理解消息機(jī)制,先來(lái)做一個(gè)測(cè)試項(xiàng)目
在新建項(xiàng)目的Form1的代碼中,加入方法:
protected override void DefWndProc(ref Message m) { if (m.Msg == 0x200) { MessageBox.Show("捕捉到消息"); } else { } base.DefWndProc(ref m); }
此方法重寫(xiě)了窗體的消息截獲代碼,運(yùn)行后會(huì)發(fā)現(xiàn),鼠標(biāo)一移向窗體就會(huì)彈窗
對(duì)于一個(gè)可視控件來(lái)說(shuō),是不斷的在接受系統(tǒng)發(fā)送的消息的。比如鼠標(biāo)懸停在某某控件上,就是一個(gè)消息,移出這個(gè)控件又是一個(gè)消息。如示例所示,其實(shí)鼠標(biāo)移入窗體,窗體就獲得了一個(gè)消息,無(wú)論你寫(xiě)沒(méi)寫(xiě)過(guò)代碼,它都獲得了這個(gè)消息,一個(gè)消息對(duì)應(yīng)觸發(fā)一個(gè)事件,編寫(xiě)了事件代碼,就會(huì)執(zhí)行相應(yīng)的代碼操作。
事件里編寫(xiě)的代碼,和方法里寫(xiě)的代碼,最主要的不同就在于前者是不知道何時(shí)觸發(fā),而后者是自己調(diào)用運(yùn)行到那里就執(zhí)行的。
那誰(shuí)來(lái)決定某個(gè)事件何時(shí)觸發(fā)呢?那就是消息
示例中的0x200是一個(gè)消息類(lèi)型,代表了鼠標(biāo)移入窗體這個(gè)消息
現(xiàn)在討論一下如何利用這種消息機(jī)制來(lái)在進(jìn)程之間傳遞值
需求:
程序A的主窗體里有一個(gè)全局變量
程序B的主窗體里有一個(gè)按鈕,點(diǎn)擊這個(gè)按鈕,獲取到程序A的這個(gè)變量
實(shí)現(xiàn):
1. 新建一個(gè)解決方案,是程序A,窗體后臺(tái)代碼重寫(xiě)DefWndProc
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } protected override void DefWndProc(ref Message m) { if (m.Msg == 0x104) { m.Result = (IntPtr)333; return; } else { } base.DefWndProc(ref m); } }
2. 新建一個(gè)解決方案,程序B,
public Form1() { InitializeComponent(); } [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private void button2_Click(object sender, EventArgs e) { Process[] arrPro = Process.GetProcessesByName("WindowsFormsApplication1.vshost"); IntPtr ip = SendMessage(arrPro[0].MainWindowHandle, 0x104, 1, 2); }
這樣,在按鈕點(diǎn)擊的時(shí)候,會(huì)向A發(fā)送一個(gè)消息,消息類(lèi)型是104,兩個(gè)參數(shù)1和2,A能捕獲到,設(shè)置結(jié)果為333,那最后在B中的ip的值就是333
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C# javascript 讀寫(xiě)Cookie的方法
這篇文章介紹了C# javascript 讀寫(xiě)Cookie的方法,有需要的朋友可以參考一下2013-10-10分享一個(gè)C#編寫(xiě)簡(jiǎn)單的聊天程序(詳細(xì)介紹)
這是一篇基于Socket進(jìn)行網(wǎng)絡(luò)編程的入門(mén)文章,我對(duì)于網(wǎng)絡(luò)編程的學(xué)習(xí)并不夠深入,這篇文章是對(duì)于自己知識(shí)的一個(gè)鞏固,同時(shí)希望能為初學(xué)的朋友提供一點(diǎn)參考。文章大體分為四個(gè)部分:程序的分析與設(shè)計(jì)、C#網(wǎng)絡(luò)編程基礎(chǔ)(篇外篇)、聊天程序的實(shí)現(xiàn)模式、程序?qū)崿F(xiàn)2015-12-12C#利用正則判斷輸入是否為純數(shù)字、容器類(lèi)
這篇文章主要介紹了C#利用正則判斷輸入是否為純數(shù)字、容器類(lèi)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法
這篇文章主要介紹了初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法,本文著重講解Lambda表達(dá)式和匿名方法的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-01-01C#/VB.NET實(shí)現(xiàn)創(chuàng)建PDF/UA文件的示例代碼
PDF/UA,即Universally?Accessible?PDF,該格式的PDF文件是于2012年8月以ISO標(biāo)準(zhǔn)14289-1發(fā)布的、具有普遍可訪問(wèn)的PDF文檔標(biāo)準(zhǔn)。本文將用C#實(shí)現(xiàn)DF/UA文件的創(chuàng)建,需要的可以參考一下2022-08-08C#中使用async和await實(shí)現(xiàn)異步Udp通訊的示例代碼
本文主要介紹了C#中使用async和await實(shí)現(xiàn)異步Udp通訊的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07c#使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸
這篇文章主要為大家詳細(xì)介紹了c#如何使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10