【问题标题】:How to preserve the contents of the clipboard如何保存剪贴板的内容
【发布时间】:2010-11-02 05:45:33
【问题描述】:

有没有办法保存剪贴板的内容?我尝试了以下代码,但它不起作用。

Dim iData As IDataObject = Clipboard.GetDataObject()
...(use clipboard)
Clipboard.SetDataObject(iData)

谢谢。

【问题讨论】:

    标签: .net clipboard


    【解决方案1】:

    保留剪贴板内容的最简单方法是不使用剪贴板。剪贴板是用户的临时存储区域,而不是应用程序,因此您尝试做的可能比破坏剪贴板更好的解决方案。

    【讨论】:

    • 感谢您的建议,但这并不能回答我的问题。
    • 好吧,如果您能在问题中包含您想要这样做的原因,那就太好了。然后更容易设计出满足您需求的解决方案。我仍然认为暂时破坏剪贴板是一个非常愚蠢的想法。
    • 没有正当理由这样做。 “在没有用户明确指示的情况下,程序不应将数据从剪贴板中传输到我们的外部。” — Charles Petzold,Windows 3.1 编程,微软出版社,1992 年
    • 我遇到这个问题是因为我想做同样的事情。无论“为什么”,.Net 类的问题在于您无法分辨数据格式的基础是什么,因此您无法以正确的格式将其放回原处。简而言之,它缺少 GetForamt() 方法。为每种标准格式轮询 ContainsData() 还不够好。
    • 至于“为什么”。就我而言,我想尝试从 WebBrowser 控件中挤出一些功能,而不必求助于低级别的东西。我可以使用剪贴板粘贴我要插入的块,但不能不覆盖剪贴板中已有的内容。
    【解决方案2】:

    您可以使用 OpenClipboard 和 CloseClipboard。根据MSDN,打开剪贴板将阻止其他应用程序更改数据。

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool OpenClipboard(IntPtr hWndNewOwner);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool CloseClipboard();
    

    【讨论】:

    • 感谢您的回答,但我想要的是能够存储剪贴板内容,使用剪贴板进行复制/粘贴,然后恢复原始内容。
    • 保持剪贴板打开也会导致其他应用程序在尝试打开剪贴板时崩溃,不能,也不能正确处理。
    【解决方案3】:

    您上面的代码在什么情况下不起作用?当我在 C# 中尝试等效代码时,调用 Clipboard.SetDataObject(iData) 时出现“CloseClipboard Failed (Exception from HRESULT: 0x800401D4 (CLIPBRD_E_CANT_CLOSE))”异常。

    但是,以下解决方法对我有用:

    // save
    Dictionary<String, Object> d = new Dictionary<String, Object>();
    IDataObject ido = Clipboard.GetDataObject();
    foreach (String s in ido.GetFormats(false))
        d.Add(s, ido.GetData(s));
    
    // ...
    
    // restore
    var da = new DataObject();
    foreach (String s in d.Keys)
        da.SetData(s, d[s]);
    Clipboard.SetDataObject(da);
    

    【讨论】:

    • 谢谢你的回答,我试过了,它适用于纯文本。不幸的是,当剪贴板中的文本来自 MS Word 时,它会引发错误。
    【解决方案4】:

    我同意上下文很重要。就我而言,我想将格式化的、动态填充的封面文档粘贴到一些动态生成的文本(全部在 MS Word 中)的前面。这是我找到的解决方案(使用 VSTO 和 C#):

                    object start = 0;
                    Word.Range startRng = a_TreatedDocument.Range(ref start, ref start);
                    startRng.FormattedText = a_CoverPageDocument.Content.FormattedText;
    

    注意,这适用于表格和格式化文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多