c#進程間通訊(Inter-Process Communication)

原文: c#進程間通訊(Inter-Process Communication)

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;
    }
}
View Code

接收端: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;
    }
}
View Code

下載:連接: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

相關文章
相關標籤/搜索