C#多进程通讯

创建结构体CopyDataStruct

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace jincheng
{
class CopyDataStruct
{
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
}
}

服务端:

using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace jincheng
{
public partial class Form1 : Form
{
//Win32 API函数
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(int hWnd, int Msg, int wParam, ref jincheng.CopyDataStruct.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 btnSend_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, @"Receiver");
if (hWnd == 0)
{
MessageBox.Show("未找到消息接受者!");
}
else
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(txtString.Text);
int len = sarr.Length;
jincheng.CopyDataStruct.COPYDATASTRUCT cds;
cds.dwData = (IntPtr)Convert.ToInt16(numericUpDown1.Value);//可以是任意值
cds.cbData = len + 1;//指定lpData内存区域的字节数
cds.lpData = txtString.Text;//发送给目标窗口所在进程的数据
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
}
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Receiver r = new Receiver(this);
r.Show();
}
}
}

客户端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace jincheng
{
public partial class Receiver : Form
{
const int WM_COPYDATA = 0x004A;
public Receiver(Form1 f1)
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e){}
private void Receiver_Load(object sender, EventArgs e){}
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
jincheng.CopyDataStruct.COPYDATASTRUCT cds = new jincheng.CopyDataStruct.COPYDATASTRUCT();
Type t = cds.GetType();
cds = (jincheng.CopyDataStruct.COPYDATASTRUCT)m.GetLParam(t);
string strResult = cds.dwData.ToString() + ":" + cds.lpData;
lsvMsgList.Items.Add(strResult);
break;
default:
base.DefWndProc(ref m);
break;
}
}
}
}

posted @ 2017-04-24 15:36  吴皓杰  阅读(762)  评论(0编辑  收藏  举报