剪贴板开启失败

时间:2012-02-01 13:46:47

标签: wpf clipboard clipboarddata

我遇到了有关剪贴板的问题,每次尝试从Excel文件进​​行复制/粘贴操作时都会收到此错误消息。

代码在Clipboard.GetDataObject()处中断,消息错误如下:

OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))

当我打开Excel,编写一些文本然后尝试复制/粘贴时,我的WPF应用程序已经运行。

我正在使用的代码是:

private void SetClipboardData()
{
    IDataObject data = Clipboard.GetDataObject();
    IList result = GetDataForFileDropFormat( data );

    if ( ( result != null ) && ( result.Count > 0 ) )
    {
        this._elementsClipboard = result;
        this._sourceDrag = null;
        this._sourceClipboard = null;
    }
}

在此处理程序方法中调用上述函数:

public void Handle_WM_DRAWCLIPBOARD( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )
{
    SendMessage( this._nextClipboardViewer, msg, wParam, lParam );

    // get data from clipboard
    SetClipboardData();

    handled = true;
}

我一直在搜索MSDN和.NET论坛,但没有找到解决此问题的方法。

有人可以帮助我,或者让我知道我应该尝试什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

这里有几个问题。拳头,虽然您确实需要将WM_DrawClipboard发送到链中的下一个应用程序,但您不需要首先执行此操作。你可以在运行自己的东西之后再这样做,然后传递信息。

接下来,不要期望Excel在一次操作中执行所有剪贴板更新。在复制复杂对象时,我已经看到Excel连续执行了24次更新。 (特别是图表 - 他们在添加每种格式后打开/关闭剪贴板)。

此外,除了纯文本之外,Excel还利用延迟渲染几乎所有内容。因此,当您的应用程序请求数据时,Excel已呈现它。这可能需要时间。

您可能需要使用"而不是成功或3-strikes循环来实现延迟"。您需要密切注意在处理之前或之后是否将WM_DrawClipboard发送到链中,因为您可能与其他对Excel数据感兴趣的剪贴板查看器建立了另一个冲突,并且必须采取措施这些伎俩本身。

你认为这很容易.....

答案 1 :(得分:0)

您是否需要检查Clipboard对象是否包含正确类型的数据并请求该类型的对象?它可以容纳多个不同类型的对象,也许你会得到一个意想不到的类型的项目。我使用类似下面的内容,但在您的情况下,您不会从Address请求我的自定义Clipboard对象。

if (System.Windows.Clipboard.ContainsData("Address"))
{
    try
    {
        return (SerializableAddress)System.Windows.Clipboard.GetData("Address");
    }
    catch (COMException)
    {
        return null; 
    }
}
return null;