C# 下的进程间的通讯 -- 发消息篇

本文介绍了一种使用.NET发送WM_COPYDATA消息实现进程间通讯的方法。通过调用非托管API SendMessage和FindWindow,发送方可以向指定窗口发送自定义数据。接收方通过重写DefWndProc方法解析接收到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Net 并没有提供进程间通讯的类,其实这句话是不对的,.Net提供了强大的进程间通讯的功能,不仅可以完成本机上进程间的通讯,还可以完成网络上的任意两台计算机间的进程通讯。这些技术分别为WebService、企业级服务、.NET 远程处理,我会在后面的文章中逐步学习总结。
这里还是借助系统的功能来实现,提供一种利用发送消息的方法实现的进程间的通信。

发送方需要调用两个系统API:SendMessage与FindWindow。
非托管定义如下:


[ DllImport ( "User32.dll" , EntryPoint = "SendMessage" )]
   private  static  extern  int  SendMessage (
    int  hWnd ,  //目标窗口的handle
    int  Msg ,  // 消息
    int  wParam ,  // 第一个消息参数
    ref  COPYDATASTRUCT  lParam  // 第二个消息参数
    );

   [ DllImport ( "User32.dll" , EntryPoint = "FindWindow" )]
   private  static  extern  int  FindWindow ( string  lpClassName , string
    lpWindowName );



还有一个数据结构:

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

WM_COPYDATA消息:

const  int  WM_COPYDATA  =  0x004A ;

发送消息代码如下:

int  WINDOW_HANDLER  =  FindWindow ( null ,@ "接收窗口" );
    if ( WINDOW_HANDLER  !=  0 )
    {
     byte []  sarr  =  System . Text . Encoding . Default . GetBytes ( txtMsg . Text );
     int  len  =  sarr . Length ;
     COPYDATASTRUCT  cds ;
     cds . dwData  =  ( IntPtr )  100 ;
     cds . lpData  =  txtMsg . Text ;
     cds . cbData  =  len  +  1 ;
     SendMessage ( WINDOW_HANDLER ,  WM_COPYDATA ,  0 ,  ref  cds );
    }

接收方需要上面的那个数据结构的定义与消息常量的定义,然后重写主窗口的DefWndProc方法:

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 );
      txtMsg . Text  = mystr . lpData ;
      break ;
     default :
      base . DefWndProc ( ref  m );
      break ;
    }
   }



别忘了引用命名空间:System.Runtime.InteropServices;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值