跨越RDC(.NET)的自定义剪贴板数据格式

时间:2009-03-23 05:23:37

标签: .net-2.0 clipboard

我正在尝试将自定义对象从RDC窗口复制到主机(我的本地)计算机。它失败。 这是我用于1)复制和2)粘贴的代码:

1)远程(在通过RDC访问的Windows XP上运行的客户端):

            //copy entry
            IDataObject ido = new DataObject();
            XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
            StringWriter sw = new StringWriter();
            x.Serialize(sw, new EntryForClipboard(entry));
            ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());
            Clipboard.SetDataObject(ido, true);

2)本地(在本地Windows XP x64工作站上运行的客户端):

                //paste entry
                IDataObject ido = Clipboard.GetDataObject();
                DataFormats.Format cdf = DataFormats.GetFormat(typeof(EntryForClipboard).FullName);

                if (ido.GetDataPresent(cdf.Name)) //<- this always returns false
                {
                    //can never get here!
                    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
                    string xml = (string)ido.GetData(cdf.Name);
                    StringReader sr = new StringReader(xml);
                    EntryForClipboard data = (EntryForClipboard)x.Deserialize(sr);
                }

它在同一台机器上完美运行。

任何提示?

2 个答案:

答案 0 :(得分:1)

您可以查看以下几项内容:

  1. 您确定对象的序列化是否真正将其转换为XML?也许输出的XML引用了你的内存空间?尝试查看XML文本以查看。
  2. 如果您确实拥有该对象的序列化XML版本,为什么不将该值存储为普通文本而不使用typeof(EntryForClipboard)?类似的东西:

    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
    StringWriter sw = new StringWriter();
    x.Serialize(sw, new EntryForClipboard(entry));
    Clipboard.SetText(sw.ToString(), TextDataFormat.UnicodeText);
    

    然后,您在客户端程序中所要做的就是检查剪贴板中的文本是否可以反序列化回您的对象。

答案 1 :(得分:1)

好的,找到了问题所在。 使用自定义格式在RDC上复制时,自定义格式名称会截断为16个字符。 在行

ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());

格式名称很长。

当我在主机上收到复制的数据时,可用格式有我的自定义格式,但截断为16个字符。

IDataObject ido = Clipboard.GetDataObject();
ido.GetFormats(); //used to see available formats.

所以我只使用了较短的格式名称:

//to copy
ido.SetData("MyFormat", sw.ToString());
...
//to paste
DataFormats.Format cdf = DataFormats.GetFormat("MyFormat");
if (ido.GetDataPresent(cdf.Name)) {
  //this not works
  ...