C# 通过copydata实现进程间通信
作者:网络转载 发布时间:[ 2016/9/2 10:42:06 ] 推荐标签:.NET 测试开发技术
近公司需要实现一个基于copydata进程间通信的功能。原来一直没有接触过Windows的进程通信,这次正好可以学习一下。
程序是基于Winform的,下面直接上代码。
公共类:
public class ImportFromDLL
{
public const int WM_COPYDATA = 0x004A;
//启用非托管代码
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData; //not used
public int cbData; //长度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
[DllImport("User32.dll")]
public static extern int SendMessage(
IntPtr hWnd, // handle to destination window
int Msg, // message
IntPtr wParam, // first message parameter
ref COPYDATASTRUCT pcd // second message parameter
);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("Kernel32.dll", EntryPoint = "GetConsoleWindow")]
public static extern IntPtr GetConsoleWindow();
}
发送方:
private void SendMessage()
{
//声明变量
string filepath = @"D:GetMsg.exe";//接收消息程序路径
string strText= "hello world!";//发送的消息//遍历系统中运行的进程,获取接收消息的进程
Process[] processes = Process.GetProcesses();
Process process = null;
foreach (Process p in processes)
{
try
{
//这两个进程的某些属性一旦访问抛出没有权限的异常
if (p.ProcessName != "System" && p.ProcessName != "Idle")
{
if (p.ProcessName == "GetMsg")
{
process = p;
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//如果接收消息的进程未运行,则开启程序
if (process == null)
{//启动接收消息程序
process = System.Diagnostics.Process.Start(filepath);
Thread.Sleep(100);//等待接收消息的程序完全打开,否则消息不能发送成功。
}
//接收端的窗口句柄
IntPtr hwndRecvWindow = process.MainWindowHandle;
//自己的进程句柄
IntPtr hwndSendWindow = Process.GetCurrentProcess().Handle;
//填充COPYDATA结构
ImportFromDLL.COPYDATASTRUCT copydata = new ImportFromDLL.COPYDATASTRUCT();
copydata.cbData = Encoding.Default.GetBytes(strText).Length; //长度 注意不要用strText.Length;
copydata.lpData = strText;//内容
//发送消息
ImportFromDLL.SendMessage(hwndRecvWindow, ImportFromDLL.WM_COPYDATA, hwndSendWindow, ref copydata);
return;
}
接收方:
protected override void WndProc(ref Message m)
{
if (m.Msg == ImportFromDLL.WM_COPYDATA)//根据Message.Msg区分消息类型,ImportFromDLL.WM_COPYDATA为发送方定义的消息类型
{
ImportFromDLL.COPYDATASTRUCT copyData = (ImportFromDLL.COPYDATASTRUCT)m.GetLParam(typeof(ImportFromDLL.COPYDATASTRUCT));//获取数据
MessageBox.Show(copyData.lpData);
}
base.WndProc(ref m);
}
注:
1、发送方和接收方均可以用C++、JAVA等实现,此处不再做讨论。
2、在发送方。如果接收方未开启,打开接收方,在打开的同时,使用了:
Thread.Sleep(100);//等待接收消息的程序打开,否则消息不能发送成功
让程序等待。若不想让程序等待,由想传递消息给接收方,则可以考虑使用一下开启进程的重载方法:
public static Process Start(string fileName, string arguments);
public static Process Start(string fileName, string userName, SecureString password, string domain);
public static Process Start(string fileName, string arguments, string userName, SecureString password, string domain);
具体使用说明,可参照API文档。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11