2017-06-14 43 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():清除剪貼板,然後向其添加文本數據。