C#應用SendMessage完成過程間通訊的辦法。本站提示廣大學習愛好者:(C#應用SendMessage完成過程間通訊的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#應用SendMessage完成過程間通訊的辦法正文
本文實例講述了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#法式設計有所贊助。