我试图通过
将字符串复制到剪贴板System.Windows.Clipboard.SetText(someString);
它失败了(Clear
之前设置之前设置不起作用,因为Clear
也需要打开剪贴板)。对GetOpenClipboardWindow()
的调用表明某些窗口正在打开剪贴板(在这种情况下它是记事本++)。
将上述行更改为:
System.Windows.Clipboard.SetDataObject(someString);
每次调用成功,剪贴板的内容都是我期望的。
有没有人对此行为有解释?
documentation并没有说明它的作用有多大(除了在程序退出时清除剪贴板)。
答案 0 :(得分:2)
在查看这两种方法的代码时,我看到以下差异:
public static void SetText(string text, TextDataFormat format)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
if (!DataFormats.IsValidTextDataFormat(format))
{
throw new InvalidEnumArgumentException("format", (int)format, typeof(TextDataFormat));
}
Clipboard.SetDataInternal(DataFormats.ConvertToDataFormats(format), text);
}
[SecurityCritical]
public static void SetDataObject(object data, bool copy)
{
SecurityHelper.DemandAllClipboardPermission();
Clipboard.CriticalSetDataObject(data, copy);
}
SetDataObject
方法被标记为安全关键,这似乎是重要的区别。但是,SetText
方法最终只是在内部调用SetDataObject
。区别在于:
/* From SetText: */
Clipboard.SetDataObject(dataObject, true);
/* From SetDataObject: */
Clipboard.SetDataObject(data, false);
当应用程序退出时, SetText(text)
永远不会清除剪贴板,而SetDataObject(object)
总是这样做。这是电话之间唯一真正的区别。尝试拨打SetDataObject(someString, false)
和SetDataObject(SomeString, true)
,看看有什么区别。如果两者的行为相同,则差异必须位于其他地方。
答案 1 :(得分:0)
来自MSDN
Clipboard.SetDataObject(): 此方法尝试以100毫秒的间隔设置数据十次,如果所有尝试都不成功,则抛出ExternalException。
Clipboard.SetText():清除剪贴板,然后向其添加文本数据。