c#處理序間通訊(Inter-Process Communication)

來源:互聯網
上載者:User

標籤:

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.