我遇到了有关剪贴板的问题,每次尝试从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论坛,但没有找到解决此问题的方法。
有人可以帮助我,或者让我知道我应该尝试什么?
谢谢!
答案 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;