想要從一個程式傳送消息到另一個程式可以使用下面兩個Win32 API 1. SendMessage( ):用來傳遞消息代號 2.FindWindows( ):用來找出目標視窗的Handler
下面例子為由Client端發送訊息至Server端
Client端程式
using System.Runtime.InteropServices;
public classClient { [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindows(string lpClassName, string lpWindowName); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
public Cliect() { //傳送代號為1982,且帶兩個參數為8與1的訊息到另一支程式 SendMsgToServer(1982, 8, 1); }
//傳送訊息至Server端 public void SendMsgToServer(int msgCode, int wp, int lp) { //先取得另一支程式的視窗Handler, //這裡使用視窗標題名稱 "Form1" 來尋找 int windowHandler = FindWindows(null, @"Form1"); if (windowHandler > 0) { //傳送訊息 int hr = SendMessage(windowHandler, msgCode, wp, lp); } } }
Server端程式(主要為覆寫 DefWndProc 事件處理函式)
publc class Server { protected override void DefWndProc(ref Message m) { if (m.Msg == 1982) { MessageBox.Show(string.Format( "My birthday is {0}-{1}-{2}", m.Msg, m.WParam, m.LParam)); } else base.DefWndProc(ref m); } }
假設我們有一個自定類別,定義如下: [Serializable] public class MyObject { public int age = 0; public string name = string.empty; } //這裡需注意的是,要使該類別的物件能被序列化,該類別必須加入[Serializable]屬性
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; using System.IO;
public class Main { public Main() { //處理序列化的物件 IFormatter formatter = new BinaryFormatter(); //要被序列化的物件 MyObject obj = new MyObject(); MemoryStream ms = new MemoryStream(); //將物件序列化 formatter .Serialize(ms, obj);