从WPF DataGrid复制时出现间歇性异常(CLIPBRD_E_CANT_OPEN)

时间:2014-04-14 05:52:33

标签: c# wpf datagrid wpf-controls clipboard

我的应用使用Copy() DataGrid方法检索导出为CSV和其他格式的所有数据。我所做的只是

  • 清除剪贴板
  • 致电myGrid.Copy()

现在通常可以正常工作 - 除了<1%的用户外,他们会收到异常。

即使在这些特定的系统上,它只会偶尔发生 ,即第一次复制工作但后续尝试失败(即相同,有效的表内容复制工作3次中的1次!) CLIPBRD_E_CANT_OPEN 错误和堆栈跟踪如

   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Windows.Clipboard.Flush()
   at System.Windows.Controls.DataGrid.OnExecutedCopy(ExecutedRoutedEventArgs args)

.net版本通常是4.0.30319.x(但据我所知,问题似乎与特定框架版本无关)。

由于出口是应用程序的一个重要特征,这个问题有很大的影响。
任何想法如何解决这个问题将不胜感激!

1 个答案:

答案 0 :(得分:3)

剪贴板是Windows中的共享资源。如果PC上的任何其他程序当前使用剪贴板,您将获得类似的例外情况。您执行的任何剪贴板操作都必须仔细编码。处理异常。重试几次,也许是在等待一段时间之后。如果在重试后仍然无效,请通知用户他必须稍后再试一次。

有些应用程序(或者可能是)完全错误地关于剪贴板。例如,有一个版本的Skype在整个Skype运行期间完全锁定了剪贴板。

您可以调用一些本机Win32函数来获取当前阻止剪贴板的窗口和进程。查看User32.dll中的GetOpenClipboardWindowGetWindowTextGetWindowThreadProcessId。然后使用Process.GetProcessById(processId).ProcessName从给定的Id中获取进程名称。

您可以在此类似问题中找到更多信息:OpenClipboard Failed when copy pasting data from wpf DataGrid