在使用Clipboard.SetText(strTar) 將文本復制進剪貼板的時候,有時候會導致Requested Clipboard operation did not succeed的異常,但有時候又不會。
原因:
剪切板被所有進程共享,但是不能同時被兩個進程修改。所以,如果有兩個程序同時訪問剪貼板,就有可能導致異常的發生。即使電腦中其他的應用程序的窗口沒有處於激活狀態,它們也可能在后台訪問剪貼板,從未導致剪貼板訪問沖突。
解決方法:
在捕獲到異常的時候,間隔一定的時間,再次嘗試對剪貼板進行操作。
在.NET framework (2.0)和其以上的版本已經提供了一個方法Clipboard.SetDataObject(object data, bool copy, int retryTimes, intretryDelay) 用來解決這個問題。他會在訪問剪貼板沖突的時候,間隔一定的時間,嘗試訪問剪貼板。
方法的說明:
// // 摘要: // 嘗試指定的次數,以將數據置於系統剪貼板中,且兩次嘗試之間具有指定的延遲,可以選擇在退出應用程序后將數據保留在剪貼板中。 // // 參數: // data: // 要置於剪貼板中的數據。 // // copy: // 如果想在退出應用程序后將數據保留在剪貼板中,則為 true;否則為 false。 // // retryTimes: // 嘗試將數據置於剪貼板中的次數。 // // retryDelay: // 兩次嘗試之間暫停的毫秒數。 // // 異常: // System.Threading.ThreadStateException: // 當前線程未處於單線程單元 (STA) 模式下。請將 System.STAThreadAttribute 添加到應用程序的 Main 方法中。 // // System.ArgumentNullException: // data 為 null。 // // System.ArgumentOutOfRangeException: // retryTimes 小於零。- 或 -retryDelay 小於零。 // // System.Runtime.InteropServices.ExternalException: // 未能將數據置於剪貼板中。這種情況通常發生在剪貼板正在被其他進程使用的時候。 public static void SetDataObject(object data, bool copy, int retryTimes, int retryDelay);
參考鏈接