有没有办法保留剪贴板的内容?我尝试了以下代码,但它不起作用。
Dim iData As IDataObject = Clipboard.GetDataObject()
...(use clipboard)
Clipboard.SetDataObject(iData)
谢谢你。
保留剪贴板内容的最简单方法是不使用剪贴板。剪贴板是用户的临时存储区域,而不是应用程序的临时存储区域,因此您尝试做的事情可能比破坏剪贴板更好的解决方案。
您上面的代码以什么方式不起作用?当我在 C# 中尝试等效代码时,在调用 Clipboard.SetDataObject(iData) 时出现“CloseClipboard 失败(来自 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);
您可以使用 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();
我同意上下文很重要。就我而言,我想将格式化的、动态填充的封面文档粘贴到一些动态生成的文本(全部在 MS Word 中)的前面。这是我找到的解决方案(使用 VSTO 和 C#):
object start = 0;
Word.Range startRng = a_TreatedDocument.Range(ref start, ref start);
startRng.FormattedText = a_CoverPageDocument.Content.FormattedText;
请注意,这适用于表格和格式化文本。