本文實例講述了C#使用SendMessage實現進程間通信的方法。分享給大家供大家參考。具體分析如下:
為了深入理解消息機制,先來做一個測試項目
在新建項目的Form1的代碼中,加入方法:
protected override void DefWndProc(ref Message m){ if (m.Msg == 0x200) { MessageBox.Show("捕捉到消息"); } else { } base.DefWndProc(ref m);}
此方法重寫了窗體的消息截獲代碼,運行后會發現,鼠標一移向窗體就會彈窗
對于一個可視控件來說,是不斷的在接受系統發送的消息的。比如鼠標懸停在某某控件上,就是一個消息,移出這個控件又是一個消息。如示例所示,其實鼠標移入窗體,窗體就獲得了一個消息,無論你寫沒寫過代碼,它都獲得了這個消息,一個消息對應觸發一個事件,編寫了事件代碼,就會執行相應的代碼操作。
事件里編寫的代碼,和方法里寫的代碼,最主要的不同就在于前者是不知道何時觸發,而后者是自己調用運行到那里就執行的。
那誰來決定某個事件何時觸發呢?那就是消息
示例中的0x200是一個消息類型,代表了鼠標移入窗體這個消息
現在討論一下如何利用這種消息機制來在進程之間傳遞值
需求:
程序A的主窗體里有一個全局變量
程序B的主窗體里有一個按鈕,點擊這個按鈕,獲取到程序A的這個變量
實現:
1. 新建一個解決方案,是程序A,窗體后臺代碼重寫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. 新建一個解決方案,程序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);}
這樣,在按鈕點擊的時候,會向A發送一個消息,消息類型是104,兩個參數1和2,A能捕獲到,設置結果為333,那最后在B中的ip的值就是333
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答