為了深入理解訊息機制,先來做一個測試專案
在建立項目的Form1的代碼中,加入方法:
protected override void DefWndProc(ref Message m) { if (m.Msg == 0x200) { MessageBox.Show("捕捉到訊息"); } else { } base.DefWndProc(ref m); }
此方法重寫了表單的訊息截獲代碼,運行後會發現,滑鼠一移向表單就會彈窗
對於一個可視控制項來說,是不斷的在接受系統發送的訊息的。比如滑鼠移至上方在某某控制項上,就是一個訊息,移出這個控制項又是一個訊息。如樣本所示,其實滑鼠移入表單,表單就獲得了一個訊息,無論你寫沒寫過代碼,它都獲得了這個訊息,一個訊息對應觸發一個事件,編寫了事件代碼,就會執行相應的代碼操作。
事件裡編寫的代碼,和方法裡寫的代碼,最主要的不同就在於前者是不知道何時觸發,而後者是自己調用運行到那裡就執行的。
那誰來決定某個事件何時觸發呢?那就是訊息
樣本中的0x200是一個訊息類型,代表了滑鼠移入表單這個訊息,更多的訊息類型請參考http://wenku.baidu.com/view/31d5b471f46527d3240ce03b.html
現在討論一下如何利用這種訊息機制來在進程之間傳遞值
需求:
程式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