標籤:
c#處理序間通訊(IPC, Inter-Process Communication)
接收端:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; //for MarshalAsnamespace receive{ public partial class Receive : Form {public Receive() { InitializeComponent(); } protected override void DefWndProc(ref System.Windows.Forms.Message m) //重構此函數接收資料 { switch (m.Msg) { case Message.WM_TEST: //確定類型後,處理資料 string message = string.Format("收到訊息!參數為:{0},{1},{2}", m.Msg, m.WParam, m.LParam); label1.Text = message; break; default: base.DefWndProc(ref m); break; } } } class Message { public const int USER = 0X0400; public const int WM_TEST = USER + 101; public const int WM_MSG = USER + 102; }}
發送端:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; //for DllImportnamespace send{ public partial class Form1 : Form { [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hWnd, int msg, int wParam, int lParam); //發送訊息 [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); //擷取另一個進程的視窗控制代碼 public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int hWnd = FindWindow(null, @"Receive"); SendMessage(hWnd, Message.WM_TEST, 99, 100);//參數1、視窗控制代碼。2 、訊息類型。 3、資料1。 4、資料2 } } class Message { public const int USER = 0X0400; public const int WM_TEST = USER + 101; //簡單的資料轉送類型,傳兩個整數。 public const int WM_MSG = USER + 102; }}
比較複雜的字串傳輸:
發送端:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; //for DllImportnamespace send{ public partial class Form1 : Form { [DllImport("User32.dll", EntryPoint = "SendMessage")] // private static extern int SendMessage(int hWnd, int msg, int wParam, int lParam); //發送訊息 private static extern int SendMessage(int hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam); [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); //擷取另一個進程的視窗控制代碼 const int WM_COPYDATA = 0x004A; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int hWnd = FindWindow(null, @"Receive"); string message = "你好訊息成功發送!"; int i = message.Length; byte[] sarr = System.Text.Encoding.Default.GetBytes(message); COPYDATASTRUCT cds; cds.dwData = (IntPtr)100; cds.lpData = message; cds.cbData = sarr.Length+1; //此值錯誤會引發接收端崩潰 SendMessage(hWnd, WM_COPYDATA, 0, ref cds); } } public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; }}View Code
接收端:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; //for MarshalAsnamespace receive{ public partial class Receive : Form { const int WM_COPYDATA = 0x004A; const int WM_MYSYMPLE = 0x005A; public Receive() { InitializeComponent(); } protected override void DefWndProc(ref System.Windows.Forms.Message m) { switch (m.Msg) { case WM_COPYDATA: COPYDATASTRUCT myStr = new COPYDATASTRUCT(); Type myType = myStr.GetType(); myStr = (COPYDATASTRUCT)m.GetLParam(myType); //m中擷取LParam參數以myType類型的方式,讓後轉換問結構體。 label1.Text = myStr.lpData; break; default: base.DefWndProc(ref m); break; } } } public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; }}View Code
下載:連結:http://pan.baidu.com/s/1c0lWpt2 密碼:yvzz
其他方法參考:
http://blog.csdn.net/feiren127/article/details/5459827
附:在程式中使用代碼啟動程式
using System.Diagnostics; // for ProcessStartInfoProcessStartInfo startInfo = new ProcessStartInfo();startInfo.FileName = @"C:\Users\dell\Documents\Visual Studio 2010\Projects\receive\receive\bin\Debug\receive.exe";Process pro = new Process();pro.StartInfo = startInfo;pro.Start(); //開啟IntPtr hWnd = pro.MainWindowHandle; //進程的控制代碼pro.Kill(); //關閉
c#處理序間通訊(Inter-Process Communication)