Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WPF数据网格复制时出现间歇性异常(CLIPBRD\u E\u CANT\u OPEN)_C#_Wpf_Datagrid_Wpf Controls_Clipboard - Fatal编程技术网

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)