应用程序间发送消息 c# SendMessage WM_COPYDATA

想做一个类似于快车一样的软件,从页面上做了点击后,将网址、链接等发送到某程序中去,其中用到了ActiveX等东东,这里不细说,这里只是说说ActiveX如何将得到的数据发送给处理程序。

发送方法:

对方法的引用

   [DllImport("user32.dll")]
   private static extern long SendMessage(Int32 hwnd, Int32 msg,Int32 hwndFrom, ref COPYDATASTRUCT cd);

   [DllImport("user32.dll")]
   private static extern Int32 FindWindow(String classname, String text);

一些需要定义的常量

const int WM_COPYDATA = 0x004A;

定义结构(类外)

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

方法:

string s = this.textBox1.Text;

//定义c,是为了取得字符串中一些非英文字符的长度,比如一个中文,占两个字长。
    Regex reg = new Regex("[^/x0-/xff]");
    int c =0;
    if(reg.IsMatch(s))
    {
     MatchCollection mc = reg.Matches(s);
     c = mc.Count;
    
    }

    Int32 hTraceWnd = FindWindow(null,"接收方");//查找窗口时要注意,单独查找类与查找名称都不可靠。
    if (hTraceWnd!=0)
    {
     Int32 id = 1;         // magic number for
     Int32 WM_COPYDATA = 0x004A;    // Win32 API message id
     COPYDATASTRUCT cd = new COPYDATASTRUCT();
     cd.dwData = (IntPtr)id;
    
     cd.lpData = s+"/0";//一定要加上结束标志,不加的话会得到不确定的字符。
    
     cd.cbData = s.Length+c+1;//另外加上双字节的东西和结束符的长度
     SendMessage(hTraceWnd, WM_COPYDATA, 0, ref cd);
    }

接收方法:

定义常量

const int WM_COPYDATA = 0x004A;

定义结构(类外)

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

方法:

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;

    }

   }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值