不同进程的消息传递方式:
1、不同窗口间消息传递函数SendMessage、PostMessage:
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;
using System.Runtime.InteropServices;
namespace sendMsg
{
public partial class Form1 : Form
{
public struct MsgStruct
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
public const int WM_COPYDATA = 0x004A; //"0x004A"是Win32在应用程序之间传递消息的指令
//通过窗口的标题来查找窗口的句柄
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
//在DLL库中的发送消息函数
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage
(
int hWnd, // 目标窗口的句柄
int Msg, // 在这里是WM_COPYDATA
int wParam, // 第一个消息参数
ref MsgStruct lParam // 第二个消息参数
);
//封装的发送消息函数,这里发送的是字符串,也可以选择其他数据类型
private void SendMsg(int hwnd, string sendString)
{
MsgStruct mss;
mss.dwData = this.Handle; //这里可以传入本窗口句柄,或其他数字,但只能是4字节整数
mss.lpData = sendString; //消息字符串
mss.cbData = System.Text.Encoding.Default.GetBytes(sendString).Length + 1; // //数据长度,按字节计算
SendMessage(hwnd, WM_COPYDATA, 0, ref mss); //发送的第一个消息参数可以自己定义,这个为0
}
//接收消息后调用的方法
protected override void WndProc(ref System.Windows.Forms.Message e)
{
if (e.Msg == WM_COPYDATA)
{
int wd = (int)e.WParam; //获取第一个参数
MsgStruct mss = (MsgStruct)e.GetLParam(typeof(MsgStruct)); //获取第二个参数
textBox1.Text = mss.lpData; //将文本信息显示到文本框
//这里反馈已收到消息,只能选择一个窗口反馈,两个窗口都反馈会进入死循环
//SendMsg((int)mss.dwData, "消息已收到!");
}
base.WndProc(ref e);
}
public Form1()
{
InitializeComponent();
}
private void sendBtn_Click(object sender, EventArgs e)
{
int hwnd = FindWindow(null, "Form2");
if (hwnd > 0)
{
SendMsg((int)hwnd, textBox2.Text);
}
else
{
MessageBox.Show("没有找到窗口“Form2”!");
}
}
}
}
2、共享内存
3、TCP/IP通讯