C# 进程之间传递数据(经过测试)

进程之间通讯的几种方法:

在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有

使用内存映射文件

通过共享内存DLL共享内存

使用SendMessage向另一进程发送WM_COPYDATA消息

比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)

WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:

这个函数的原型及其要用到的结构如下:

SendMessage(hwnd,WM_COPYDATA,wParam,lParam);

其中,WM_COPYDATA对应的十六进制数为0x004A

wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:

typedef struct tagCOPYDATASTRUCT{

DWORD dwData;//用户定义数据

DWORD cbData;//数据大小

PVOID lpData;//指向数据的指针

}COPYDATASTRUCT;

该结构用来定义用户数据。

具体过程如下:

首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.

接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.


[csharp]  view plain copy print ?
  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.ComponentModel;    
  4. using System.Data;    
  5. using System.Drawing;    
  6. using System.Linq;    
  7. using System.Text;    
  8. using System.Windows.Forms;    
  9. using System.Runtime.InteropServices;    
  10.    
  11. namespace Client    
  12. {    
  13.     public partial class FrmClient : Form    
  14.     {    
  15.         public FrmClient()    
  16.         {    
  17.             InitializeComponent();    
  18.         }    
  19.    
  20.         private void FrmClient_Load(object sender, EventArgs e)    
  21.         {    
  22.    
  23.         }    
  24.    
  25.         [DllImport("User32.dll",EntryPoint="SendMessage")]    
  26.    
  27.         private static extern int SendMessage(    
  28.    
  29.         int hWnd, // handle to destination window    
  30.    
  31.         int Msg, // message    
  32.    
  33.         int wParam, // first message parameter    
  34.    
  35.         ref COPYDATASTRUCT lParam // second message parameter    
  36.    
  37.         );    
  38.    
  39.    
  40.         [DllImport("User32.dll",EntryPoint="FindWindow")]    
  41.    
  42.         private static extern int FindWindow(string lpClassName,string   
  43.    
  44.         lpWindowName);    
  45.    
  46.    
  47.         public struct COPYDATASTRUCT    
  48.         {    
  49.    
  50.             public IntPtr dwData;    
  51.    
  52.             public int cbData;    
  53.    
  54.             [MarshalAs(UnmanagedType.LPStr)]    
  55.             public string lpData;    
  56.    
  57.         }    
  58.    
  59.         const int WM_COPYDATA = 0x004A;    
  60.    
  61.    
  62.         private void btnSend_Click(object sender, EventArgs e)    
  63.         {    
  64.             int WINDOW_HANDLER = FindWindow(null, @"C#进程间通信(Server)");    
  65.    
  66.             if (WINDOW_HANDLER != 0)    
  67.             {    
  68.    
  69.                 byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);    
  70.    
  71.                 int len = sarr.Length;    
  72.    
  73.                 COPYDATASTRUCT cds;    
  74.   
  75.  cds.dwData = (IntPtr)100;    
  76.    
  77.                 cds.lpData = this.textBox1.Text;    
  78.    
  79.                 cds.cbData = len + 1;    
  80.    
  81.                 SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);    
  82.             }    
  83.         }    
  84.     }    
  85. }    


接收端代码:
[csharp]  view plain copy print ?
  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.ComponentModel;    
  4. using System.Data;    
  5. using System.Drawing;    
  6. using System.Linq;    
  7. using System.Text;    
  8. using System.Windows.Forms;    
  9. using System.Runtime.InteropServices;    
  10.    
  11. namespace Server    
  12. {    
  13.     public partial class FrmServer : Form    
  14.     {    
  15.         public FrmServer()    
  16.         {    
  17.             InitializeComponent();    
  18.         }    
  19.    
  20.         private void Form1_Load(object sender, EventArgs e)    
  21.         {    
  22.    
  23.         }    
  24.    
  25.    
  26.         public struct COPYDATASTRUCT    
  27.         {    
  28.             public IntPtr dwData;    
  29.             public int cbData;    
  30.             [MarshalAs(UnmanagedType.LPStr)]    
  31.             public string lpData;    
  32.         }    
  33.    
  34.         const int WM_COPYDATA = 0x004A;    
  35.    
  36.         protected override void DefWndProc(ref System.Windows.Forms.Message m)    
  37.         {    
  38.             switch (m.Msg)    
  39.             {    
  40.                 case WM_COPYDATA:    
  41.                     COPYDATASTRUCT mystr = new COPYDATASTRUCT();    
  42.                     Type mytype = mystr.GetType();    
  43.                     mystr = (COPYDATASTRUCT)m.GetLParam(mytype);    
  44.                     lblMsg.Text = "收到消息:" + mystr.lpData;    
  45.                     MessageBox.Show ("收到消息:" + mystr.lpData);    
  46.                     break;    
  47.                 default:    
  48.                     base.DefWndProc(ref m);    
  49.                     break;    
  50.             }    
  51.         }    
  52.     }    
  53. }    

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值