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

来源:互联网 发布:犀牛软件没有工具栏 编辑:程序博客网 时间:2024/05/22 07:03

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;

原创粉丝点击