zoukankan      html  css  js  c++  java
  • 【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_send
    17 {
    18     public partial class Form1 : Form
    19     {
    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 = 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             else
    46             {
    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 = (IntPtr)flag;
    57                 cds.cbData = bt.Length;
    58                 cds.lpData = 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_receiver
    17 {
    18     public partial class Form1 : Form
    19     {
    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 = 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 += "
    " + 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 ClassLibrary1
    12 {
    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 COPYDATASTRUCT
    25     {
    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)

  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/Fefnir/p/5875687.html
Copyright © 2011-2022 走看看