C#处理跨进程copy

一、问题描述:做IDE开发经常会遇到这样一种情况:使用者开两个应用程序,把一个应用程序中的控件copy到另一个应用程序中。

 

这样做只是用户的一个使用小细节便于使用者对比刻制,我们如果能抓住这些细节,那么我们的产品客户体验度会上一个层次。

 

二、解决思路:跨应用程序copy,也可以说是两个单独的进程间通信。两个进程间的通信大概有以下几种:剪贴板Clipboard、窗

 

口消息、使用共享内存、动态数据交换、消息管道(有匿名通道、命名通道)、邮件槽、套接字、internet、RPC(远程过程调用)、串

 

行并行通信、COM/DCOM等。当前采用剪切板的方式。

 

原理如下:在copy端,把要copy的数据写到剪切板中,在pase端,在剪切板中取出对应类型的数据。

 

、解决方案:开始以为:按照上面说的原理,把控件写到剪切板中不就ok。范例如下:

 

copy端:

    TreeNode t = new TreeNode("ClipBoardNode");

            Clipboard.SetData("TreeNode", t);
         pase端:
	    TreeNode t = (TreeNode)Clipboard.GetData("TreeNode");
            if (treeView1.SelectedNode == null)
                treeView1.Nodes.Add(t);
            else
                treeView1.SelectedNode.Nodes.Add(t);
          可是一运行出现当机:error信息大致是:TreeNode 不可以序列化。
	 原来:对于控件是不可以直接写到剪切板中的,写到剪切板中的数据必须是以流的形式。而上面,控件是不可以直接序列化成流的。
	新的解决方案:	
	需要写个单独的方法,对控件做序列化处理后,才能写到剪切板中。
	 private string Serialize(object objectToSerialize)
        {
            string serialString = null;
            using (System.IO.MemoryStream ms1 = new System.IO.MemoryStream())
            {
                BinaryFormatter b = new BinaryFormatter();
                b.Serialize(ms1, objectToSerialize);
                byte[] arrayByte = ms1.ToArray();
                serialString = Convert.ToBase64String(arrayByte);
            }
            return serialString;
        }
	private object DeSerialize(string serializationString)
        {
            object deserialObject = null;
            byte[] arrayByte = Convert.FromBase64String(serializationString);
            using (System.IO.MemoryStream ms1 = new System.IO.MemoryStream(arrayByte))
            {
                BinaryFormatter b = new BinaryFormatter();
                deserialObject = b.Deserialize(ms1);
            }
            return deserialObject;
        }
	然后:copy端:
	TreeNode t = new TreeNode("ClipBoardNode");
            Clipboard.SetData("TreeNode", Serialize(t));
        pase端:
	 TreeNode t = (TreeNode)DeSerialize(Clipboard.GetData("TreeNode").ToString());
            if (treeView1.SelectedNode == null)
                treeView1.Nodes.Add(t);
            else
                treeView1.SelectedNode.Nodes.Add(t);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值