2017-06-14 74 views
1

我试图将一个字符串复制到剪贴板通过剪贴板的setText失败而SetDataObject不

System.Windows.Clipboard.SetText(someString); 

并且它设置没有工作,因为Clear还需要打开剪贴板前设置之前失败(Clear ING )。拨打GetOpenClipboardWindow()表示某窗口保持剪贴板打开(在这种情况下,它是记事本++)。

通过改变上述行:

System.Windows.Clipboard.SetDataObject(someString); 

调用成功,每次和剪贴板中的内容是什么我期待。

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

documentation没有详细说明它的不同之处(除了程序退出时清除剪贴板)。

回答

1

当这两个方法的代码看,我看到如下区别:

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)以查看任何区别。如果两者表现相同,则差异必须位于其他地方。

+0

谢谢你的努力。我想我需要阅读调用背后的Win32 API,才能真正理解正在发生的事情。 – RedX

0

从MSDN

Clipboard.SetDataObject(): 此方法试图设置数据在100毫秒间隔十倍,并且如果所有尝试都不成功引发ExternalException。

Clipboard.SetText():清除剪贴板,然后向其添加文本数据。