剪贴板SetText失败,而SetDataObject则失败

时间:2017-06-14 07:43:09

标签: c#

我试图通过

将字符串复制到剪贴板
System.Windows.Clipboard.SetText(someString);

它失败了(Clear之前设置之前设置不起作用,因为Clear也需要打开剪贴板)。对GetOpenClipboardWindow()的调用表明某些窗口正在打开剪贴板(在这种情况下它是记事本++)。

将上述行更改为:

System.Windows.Clipboard.SetDataObject(someString);

每次调用成功,剪贴板的内容都是我期望的。

有没有人对此行为有解释?

documentation并没有说明它的作用有多大(除了在程序退出时清除剪贴板)。

2 个答案:

答案 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():清除剪贴板,然后向其添加文本数据。