【问题标题】:Get data from then back to Windows Clipboard从那时起将数据返回到 Windows 剪贴板
【发布时间】:2013-01-16 03:12:43
【问题描述】:

我想获取当前存储在 Windows 剪贴板中的数据并将其保存在一个变量中,然后将数据放回剪贴板中。

现在我正在使用这个代码:

object l_oClipBrdData = Clipboard.GetDataObject();
Clipboard.SetDataObject(l_oClipBrdData ,true);

但是在这样做之后剪贴板是空的。

我做错了什么?

【问题讨论】:

标签: c# copy clipboard paste


【解决方案1】:

尝试在SetDataObject() 之后调用Clipboard.Flush();

【讨论】:

  • Clipboard 中没有Flush
【解决方案2】:

Clipboard.GetDataObject()会从剪贴板返回IDataObject,如果你想得到实际数据可以调用GetData(typeof(dataType))

例子:

        int mydata = 100;

        Clipboard.SetDataObject(mydata, true);

        var clipData = Clipboard.GetDataObject().GetData(typeof(int)); 

还有很多你可以使用的预定义数据类型

例子:

        if (Clipboard.ContainsData(DataFormats.Bitmap))
        {
            var clipData = Clipboard.GetData(DataFormats.Bitmap);
        }

【讨论】:

    【解决方案3】:

    这是一个演示“剪贴板”对象的示例:

    string text;
    string[] a;
    
    if (Clipboard.ContainsText())
       {
          text = Clipboard.GetText(TextDataFormat.Text);
    
          //  the following could have been done simpler with
          //  a Regex, but the regular expression would be not
          //  exactly simple
    
          if (text.Length > 1)
              {
                  //  unify all line breaks to \r
                  text = text.Replace("\r\n", "\r").Replace("\n", "\r");
    
                  //  create an array of lines
                  a = text.Split('\r');
    
                  //  join all trimmed lines with a space as separator
                  text = "";
    
                  //  can't use string.Join() with a Trim() of all fragments
                  foreach (string t in a)
                  {
                      if (text.Length > 0)
                          text += " ";
                      text += t.Trim();
                  }
    
                Clipboard.SetDataObject(text, true);
              }
        }
    

    【讨论】:

    • 你为什么要专注于文字。问题似乎很笼统。为什么 Q 中的代码没有按照提问者的预期表现?如果要将文本放在剪贴板上,请使用 SetText。
    • 该示例旨在演示以下步骤:1.) 确保剪贴板包含您期望/想要的类型的数据 2.) 复制数据 3.) 处理数据 4.) 写入回来了。就其本身而言,该示例很有用。我每天通过任务栏快捷方式调用它几次,将带有换行符的文本转换为适合作为文件名的字符串。
    • 我用文本成功地这样做了..但这还不够。我想要做的是创建一个可以存储超过 1 个项目的剪贴板,这样我就可以随意复制和粘贴内容,而不会在每次按 CTRL+C 时覆盖复制的数据。如果我使用 setText 和 getText,该代码可以完美运行。但我希望它能够适用于可能存储在剪贴板中的所有内容。所以我想取出剪贴板中的任何内容,存储它,然后按原样放回原样
    • 不久前在 Codeproject 中提出了另一个剪贴板管理器(在 C# 中):codeproject.com/Articles/18568/…
    【解决方案4】:

    传递给 SetDataObject() 的对象应该支持序列化。如果这是您自己的类型,请使用 [Serializable] 属性对其进行标记。

    更多信息:

    http://msdn.microsoft.com/en-gb/library/cs5ebdfz(v=vs.90).aspx

    http://www.codeproject.com/Articles/8102/Saving-and-obtaining-custom-objects-to-from-Window

    【讨论】:

    • 对象从剪贴板中拉出。
    • 没有例外,它不是我的对象,它是一个已经在剪贴板中的对象。它可以是任何文本、打印屏幕、文件或其他任何内容。我将其更改为 IdataObject - 仍然无法正常工作
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2014-09-14
    • 2023-03-13
    相关资源
    最近更新 更多