Requested Clipboard operation did not succeed的解决办法

在使用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);

参考链接

ClipBoard.SetText Exception

Requested Clipboard operation did not succeed—MSDB Forums.

Requested Clipboard operation did not succeed—StackOverFlow

原文地址:https://www.cnblogs.com/kissazi2/p/2954915.html