c#進程間通訊(IPC, Inter-Process Communication)html
接收端:c#
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 MarshalAs namespace 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; } }
發送端:ide
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 DllImport namespace 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);//參數一、窗口句柄。2 、消息類型。 三、數據1。 四、數據2 } } class Message { public const int USER = 0X0400; public const int WM_TEST = USER + 101; //簡單的數據傳輸類型,傳兩個整數。 public const int WM_MSG = USER + 102; } }
比較複雜的字符串傳輸:函數
發送端:post
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 DllImport namespace 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; } }
接收端:url
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 MarshalAs namespace 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; } }
下載:連接:http://pan.baidu.com/s/1c0lWpt2 密碼:yvzzspa
其餘方法參考:.net
http://blog.csdn.net/feiren127/article/details/5459827code
附:在程序中使用代碼啓動程序orm
using System.Diagnostics; // for ProcessStartInfo ProcessStartInfo 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(); //關閉
參考: http://blog.csdn.net/u011000290/article/details/48108557