从.NET设置剪贴板时CLIPBRD_E_CANT_OPEN错误

时间:2020-03-05 18:54:59  来源:igfitidea点击:

为什么以下代码有时会导致内容为" CLIPBRD_E_CANT_OPEN"的异常:

Clipboard.SetText(str);

这通常是在应用程序中第一次使用剪贴板时发生,而不是在此之后发生。

解决方案

回答

实际上,我认为这是Win32 API的错误。

要在剪贴板中设置数据,我们必须先打开它。一次只能打开一个进程。因此,当我们检查时,如果另一个进程由于某种原因打开了剪贴板,则我们尝试打开它的尝试将失败。

碰巧的是,终端服务跟踪剪贴板,并且在Windows的较早版本(Vista之前的版本)上,我们必须打开剪贴板才能查看其中的内容...最终将我们拒之门外。唯一的解决方案是等待终端服务关闭剪贴板,然后重试。

重要的是要意识到,这并非特定于终端服务:它可以发生在任何事情上。在Win32中使用剪贴板是一个巨大的竞争条件。但是,由于设计使我们只能响应用户输入而随意修改剪贴板,因此通常不会出现问题。

回答

这是由终端服务剪贴板中的错误/功能(以及可能的其他情况)和剪贴板的.NET实现引起的。打开剪贴板的延迟会导致错误,该错误通常会在几毫秒内消失。

解决方案是在一个循环中尝试多次,然后在两者之间睡眠。

for (int i = 0; i < 10; i++)
{
    try
    {
        Clipboard.SetText(str);
        return;
    }
    catch { }
    System.Threading.Thread.Sleep(10);
}