首页 > 代码库 > 【C#】Send data between applications

【C#】Send data between applications

This sample shows how to send data between different applications, including object data——transform object into byte[] and then transport its CPU location.

Now I‘ll paste the programs here.(Thanks the blogger Sir.jevan for the template he/she provide,what I have done is just make the object-transportation available.Here is his page.)

 

Sender:

 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms;10 using System.Runtime.InteropServices;11 using System.IO;  //The following four usings are important.So are they in Reciever and dll.12 using System.Runtime.Serialization.Formatters.Binary;13 using System.Runtime.Serialization;14 using ClassLibrary1;15 16 namespace cdn_send17 {18     public partial class Form1 : Form19     {20         public Form1()21         {22             InitializeComponent();23         }        24 25         private void Form1_Load(object sender, EventArgs e)26         {27         }28 29         private const int WM_COPYDATA = http://www.mamicode.com/0x004A;30         private const uint flag = 0x8000; //I can‘t understand it.Please tell me(if you got it).31         [DllImport("User32.dll", EntryPoint = "SendMessage")]32         private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);33         [DllImport("User32.dll", EntryPoint = "FindWindow")]34         private static extern int FindWindow(string lpClassName, string lpWindowName);35         [DllImport("kernel32.dll")]36         static extern uint GetTickCount();37 38         private void button1_Click(object sender, EventArgs e)39         {40             int WINDOW_HANDLER = FindWindow(null, @"xxx");  //Find target window.Well,by the way,it‘s called ‘xxx‘.41             if (WINDOW_HANDLER == 0)42             {43                 MessageBox.Show("xxx");44             }45             else46             {47                 48                 data dd=new data();  //Process data.49                 dd.x = (int)this.Handle;50                 dd.y = DateTime.Now;51                 dd.tx = textBox1.Text;52                 dd.tk = GetTickCount();53                 byte[] bt=(new switcher()).Object2Bytes((object)dd);  //Type switch.54 55                 COPYDATASTRUCT cds;56                 cds.dwData =http://www.mamicode.com/ (IntPtr)flag;57                 cds.cbData =http://www.mamicode.com/ bt.Length;58                 cds.lpData = http://www.mamicode.com/Marshal.AllocHGlobal(bt.Length);  //Allocate space.59 60                 Marshal.Copy(bt, 0, cds.lpData, bt.Length);  //Memory copy.61                 SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);  //Send message out.62             }63         }64     }65     66 }

 

Reciever:

 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms;10 using System.Runtime.InteropServices;11 using System.IO;  //Important.12 using System.Runtime.Serialization.Formatters.Binary;13 using System.Runtime.Serialization;14 using ClassLibrary1;15 16 namespace cdn_receiver17 {18     public partial class Form1 : Form19     {20 21         public Form1()22         {23             InitializeComponent();24         }25         private void Form1_Load(object sender, EventArgs e)26         {27 28         }29 30         const int WM_COPYDATA = http://www.mamicode.com/0x004A;31         private const uint flag = 0x8000;32         [DllImport("kernel32.dll")]33         public static extern uint GetTickCount();34 35         protected override void DefWndProc(ref System.Windows.Forms.Message m)36         {37             switch (m.Msg)38             {39                 case WM_COPYDATA:40 41                     COPYDATASTRUCT cds = new COPYDATASTRUCT();42                     cds = (COPYDATASTRUCT)m.GetLParam(cds.GetType()); //Receive information.43 44                     byte[] bt = new byte[cds.cbData];45                     Marshal.Copy(cds.lpData,bt,0,bt.Length);  //Get data array.46 47                     data dd = (data)((new switcher()).Bytes2Object(bt));  //Transform back.48                     long xx = GetTickCount() - dd.tk;  //This line is used to calculate its delay,although mostly it is 0ms.49                     textBox1.Text = (dd.x.ToString() + " " + dd.y.ToString() + " " + dd.tx);50                     textBox1.Text += "\r\n" + xx.ToString() + "ms";51                     52                     break;53                 default:54                     base.DefWndProc(ref m);  //Don‘t forget this line,or it cannot run properly.55                     break;56             }57 58         }59     }60     61 62 }

 

Dll:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Runtime.InteropServices; 7 using System.Runtime; 8 using System.IO; //Important 9 using System.Runtime.Serialization;10 using System.Runtime.Serialization.Formatters.Binary;11 namespace ClassLibrary112 {13         14     [Serializable]  //My datastructure which contains different types.Don‘t forget this line.15     public struct data  16     {17         public int x;18         public DateTime y;19         public string tx;20         public long tk;21     }22 23     [StructLayout(LayoutKind.Sequential)]  //The datastructure which used as a media to transport.24     public struct COPYDATASTRUCT25     {26         public IntPtr dwData;27         public int cbData;28         public IntPtr lpData;29     }30 31     public class switcher  //The switcher object which contains two main switcher function.32     {33         public byte[] Object2Bytes(object obj)34         {35             IFormatter fmt = new BinaryFormatter();36             MemoryStream ms = new MemoryStream();37             fmt.Serialize(ms, obj);38             return ms.GetBuffer();39 40         }41 42         public object Bytes2Object(byte[] bt)43         {44             IFormatter fmt = new BinaryFormatter();45             MemoryStream ms = new MemoryStream(bt);46             return (object)fmt.Deserialize(ms);47         }48 49         public switcher(){50         }51     }52 53 }

 

It is tested that there is no problem with the correction of the transported data.(My vs version is 2012 ultimate,OS version is win7)

 

【C#】Send data between applications