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);
}
此方法重寫了窗體的消息截獲代碼,運(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ú)論你寫沒(méi)寫過(guò)代碼,它都獲得了這個(gè)消息,一個(gè)消息對(duì)應(yīng)觸發(fā)一個(gè)事件,編寫了事件代碼,就會(huì)執(zhí)行相應(yīng)的代碼操作。
事件里編寫的代碼,和方法里寫的代碼,最主要的不同就在于前者是不知道何時(shí)觸發(fā),而后者是自己調(diào)用運(yùn)行到那里就執(zhí)行的。
那誰(shuí)來(lái)決定某個(gè)事件何時(shí)觸發(fā)呢?那就是消息
示例中的0x200是一個(gè)消息類型,代表了鼠標(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)代碼重寫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è)消息,消息類型是104,兩個(gè)參數(shù)1和2,A能捕獲到,設(shè)置結(jié)果為333,那最后在B中的ip的值就是333
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
分享一個(gè)C#編寫簡(jiǎn)單的聊天程序(詳細(xì)介紹)
這是一篇基于Socket進(jìn)行網(wǎng)絡(luò)編程的入門文章,我對(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-12
初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法
這篇文章主要介紹了初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法,本文著重講解Lambda表達(dá)式和匿名方法的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-01-01
C#/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-08
C#中使用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-07
c#使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸
這篇文章主要為大家詳細(xì)介紹了c#如何使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10

