C# 从WPF数据网格复制时出现间歇性异常(CLIPBRD\u E\u CANT\u OPEN)
我的应用程序使用C# 从WPF数据网格复制时出现间歇性异常(CLIPBRD\u E\u CANT\u OPEN),c#,wpf,datagrid,wpf-controls,clipboard,C#,Wpf,Datagrid,Wpf Controls,Clipboard,我的应用程序使用DataGrid的Copy()方法检索所有数据以导出为CSV和其他格式。我所做的就是 清除剪贴板 调用myGrid.Copy() 现在,它通常工作正常-除了之外,剪贴板是Windows中的共享资源。如果电脑上的任何其他程序当前使用剪贴板,则会出现类似的异常。任何剪贴板操作都必须非常小心地编码。处理异常。请重试几次,可能需要等待一段时间。如果重试几次后仍不起作用,请通知用户以后必须重试 有一些应用程序(或者可能)在剪贴板方面完全有缺陷。例如,有一个版本的Skype在整个Skyp
DataGrid
的Copy()
方法检索所有数据以导出为CSV和其他格式。我所做的就是
- 清除剪贴板
- 调用myGrid.Copy()
现在,它通常工作正常-除了之外,剪贴板是Windows中的共享资源。如果电脑上的任何其他程序当前使用剪贴板,则会出现类似的异常。任何剪贴板操作都必须非常小心地编码。处理异常。请重试几次,可能需要等待一段时间。如果重试几次后仍不起作用,请通知用户以后必须重试 有一些应用程序(或者可能)在剪贴板方面完全有缺陷。例如,有一个版本的Skype在整个Skype运行期间完全锁定了剪贴板 您可以调用一些本机Win32函数来获取当前阻止剪贴板的窗口和进程。查看User32.dll中的
GetOpenClipboardWindow
、GetWindowText
和GetWindowThreadProcessId
。然后使用Process.GetProcessById(processId).ProcessName
从给定Id获取进程名称
您可以在这个类似的问题中找到更多信息:只是为了消除明显的问题;你处理过空字段吗?也就是说,
null
字段应该包含数据?是的-在一个特定示例中,表中有相同数据的情况是三分之一。所以它一定是我们应用程序之外的东西-我想..嗯-很有趣。有没有办法告诉用户当前哪个进程拥有剪贴板,这样我们就可以告诉用户,即重试方案最终是否会失败?@cacau我已经编辑了答案,以显示如何获得进程名称。添加了重试方法,它似乎可以在我们的本地测试和至少一个客户系统上工作-干杯!
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Windows.Clipboard.Flush()
at System.Windows.Controls.DataGrid.OnExecutedCopy(ExecutedRoutedEventArgs args)