在使用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);
参考链接