如何保留剪贴板的内容

4

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

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

谢谢。

4个回答

3

保留剪贴板内容最简单的方法是不要操作剪贴板。剪贴板是为用户提供临时存储区域而设计的,而不是为应用程序而设计的,因此您尝试做的事情可能有比破坏剪贴板更好的解决方案。


3
谢谢您的建议,但那并没有回答我的问题。 - a programmer
3
这样做没有合理的原因。 “程序不应在没有用户明确指令的情况下将数据传输到或从剪贴板中。” —— Charles Petzold,《Programming Windows 3.1》,微软出版社,1992年。 - Chris Thornton
1
关于“为什么”。在我的情况下,我想尝试从WebBrowser控件中挤出一些功能,而不必诉诸低级别的操作。我可以使用剪贴板粘贴我想要插入的块,但是不能不覆盖已经存在于剪贴板中的内容。 - Swanny
常见的将格式化的富文本复制到文字编辑器中的方式是使用剪贴板。我尚未找到提供替代方案的解决方案,我已经尝试过了。 - Magnum
ROFL - 告诉微软MapPoint开发人员,他们选择剪贴板作为主要接口。 - SChalice
显示剩余3条评论

0
你的上面的代码有什么问题?当我在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 时,它会抛出一个错误。 - a programmer

0

我认为上下文很重要。在我的情况下,我想将一个格式化的、动态填充的封面页文档粘贴到一些动态生成的文本前面(都在MS Word中)。这是我找到的解决方案(使用VSTO和C#):

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

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

0

您可以使用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();

1
谢谢您的回答,但是我想要的是能够存储剪贴板内容,使用剪贴板进行复制/粘贴,然后恢复原始内容。 - a programmer
保持剪贴板打开状态会导致其他应用程序在尝试打开剪贴板时崩溃,无法正确处理。 - Chris Thornton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接