首页 > 代码库 > 【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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。