zoukankan      html  css  js  c++  java
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据

    原文地址:http://www.kehui.net/index.php?op=article&file=read&aid=16470


    简介:

    本文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据.


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

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


      使用内存映射文件
      通过共享内存DLL共享内存
      使用SendMessage向另一进程发送WM_COPYDATA消息


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


    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;
    该结构用来定义用户数据。


    具体过程如下:


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


    代码中有适量的解释,大家请自己看吧.


    具体代码如下:

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Runtime.InteropServices;


    namespace WindowsFormGetMsg
    {
     public class Form1 : System.Windows.Forms.Form
     {
      private System.Windows.Forms.TextBox textBox1;
      private System.ComponentModel.Container components = null;
      const int WM_COPYDATA = 0x004A;


      public Form1()
      {
       InitializeComponent();
      }


      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if (components != null)
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }


      #region Windows Form Designer generated code
      private void InitializeComponent()
      {
       this.textBox1 = new System.Windows.Forms.TextBox();
       this.SuspendLayout();
       //
       // textBox1
       //
       this.textBox1.Location = new System.Drawing.Point(176, 32);
       this.textBox1.Name = "textBox1";
       this.textBox1.Size = new System.Drawing.Size(160,


    21);
       this.textBox1.TabIndex = 0;
       this.textBox1.Text = "textBox1";
       //
       // Form1
       //
       this.AutoScaleBaseSize = new System.Drawing.Size(6,


    14);
       this.ClientSize = new System.Drawing.Size(432, 266);
       this.Controls.AddRange(new


    System.Windows.Forms.Control[] {
              


             


    this.textBox1});
       this.Name = "Form1";
       this.Text = "接收方";
       this.ResumeLayout(false);


      }
      #endregion


      [STAThread]
      static void Main()
      {
       Application.Run(new Form1());
      }


      protected override void DefWndProc(ref


    System.Windows.Forms.Message m)
      {
       switch(m.Msg)
       {
         //接收自定义消息 USER,并显示其参数
        case WM_COPYDATA:
         COPYDATASTRUCT mystr = new


    COPYDATASTRUCT();
           Type mytype = mystr.GetType();


           mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
         this.textBox1.Text  =mystr.lpData;


         break;
        default:
         base.DefWndProc(ref m);
         break;


       }


      }


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



    //---------------------------------------------------
    //接受方
    //---------------------------------------------------
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Runtime.InteropServices;


    namespace WindowsFormGetMsg
    {
     public class Form1 : System.Windows.Forms.Form
     {
      private System.Windows.Forms.TextBox textBox1;
      private System.ComponentModel.Container components = null;
      const int WM_COPYDATA = 0x004A;


      public Form1()
      {
       InitializeComponent();
      }


      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if (components != null)
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }


      #region Windows Form Designer generated code
      private void InitializeComponent()
      {
       this.textBox1 = new System.Windows.Forms.TextBox();
       this.SuspendLayout();
       //
       // textBox1
       //
       this.textBox1.Location = new System.Drawing.Point


    (176, 32);
       this.textBox1.Name = "textBox1";
       this.textBox1.Size = new System.Drawing.Size(160, 21);
       this.textBox1.TabIndex = 0;
       this.textBox1.Text = "textBox1";
       //
       // Form1
       //
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.ClientSize = new System.Drawing.Size(432, 266);
       this.Controls.AddRange(new System.Windows.Forms.Control[] {this.textBox1});
       this.Name = "Form1";
       this.Text = "接收方";
       this.ResumeLayout(false);
      }
      #endregion

      [STAThread]
      static void Main()
      {
       Application.Run(new Form1());
      }

      protected override void DefWndProc(ref System.Windows.Forms.Message m)
      {
       switch(m.Msg)
       {
         //接收自定义消息 USER,并显示其参数
        case WM_COPYDATA:
         COPYDATASTRUCT mystr = new COPYDATASTRUCT();
           Type mytype = mystr.GetType();

         mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
         this.textBox1.Text  =mystr.lpData;

         break;
        default:
         base.DefWndProc(ref m);
         break;
       }
      }
     }

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



    //---------------------------------------------------
    //发送方:
    //---------------------------------------------------


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

  • 相关阅读:
    Struts类型转换
    Oracle的学习,知识点整理
    常用的Oracle_SQL语句
    Oracle的优化
    Oracle创建表空间,用户,授权
    Linux权限的控制
    Oracle实例的3种连接方式和所使用的连接工具
    Oracle数据库打开端口
    Hibernate一对多配置
    hibernate UUID问题
  • 原文地址:https://www.cnblogs.com/snowlove67/p/310668.html
Copyright © 2011-2022 走看看