WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
在这个过程中想通过程序将一些东西复制到剪切板中,代码很简单:Clipboard.SetText(lineTexts[lineIndex]);就这一句,想把lineTexts这个字符串List中的第lineIndex项复制到剪切板中,但是运行的时候就会抛出异常,大致的异常信息是“OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))”(挺长的一段,注意没写全)。而winform那边之前也用过,没有问题。
上网搜索了一下,看了挺多资料,发现是WPF本身对Clipboard处理的问题,在.Net4.0及之前的版本中都有问题,最近Micorsoft已经在.Net4.5中修复了。问题主要是由于:在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问,从而抛出异常。
在.Net4.0上,解决这个问题,我大概总结了一下,有下面几种方法:
- 自行截获异常,进行处理
for (int i = ; i < ; i++)
{
try
{
Clipboard.SetText(lineTexts[lineIndex]);
break;
}
catch
{
System.Threading.Thread.Sleep();//这句加不加都没关系
}
}
这种方法处理过程中UI会有一小段时间的假死。。。可以考虑多线程?
2. 换一种方式设置剪切板
Clipboard.SetDataObject(lineTexts[lineIndex]);
就这一句。。。这种方法不会抛异常,UI也没有假死,非常正常!估计SetDataObject方法跟SetText方法的实现不一样,没有细究。。。
3. 跟方法1类似,不过有点高级
剪切板处理的那句代码不变,还是使用SetText方法。
在App.xaml文件中添加下面代码中红色的部分
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException">
在App.xaml.cs文件中添加代码:
void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
var comException = e.Exception as System.Runtime.InteropServices.COMException;
if (comException != null && comException.ErrorCode == -2147221040)///OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
e.Handled = true;
}
这种方法中剪切板动作会自动多次尝试,由于抛出的异常被App中的异常处理给截获了,所以会不断的尝试直到成功。方法三也有一定程度的UI假死。对于方法三,具体原理可以到MSDN上搜一下DispatcherUnhandledException或相关内容,这里一时半会说不清楚。
方法三使用范围广,可以类似的处理其他的异常。而方法二只能是自己的代码才能解决,如果用到WPF控件或者其他第三方控件就不行了。所以推荐方法三,但如果是自己写的代码,用方法二就简单方便的多。
WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))的更多相关文章
- WPF复制异常问题(OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))
最近在维护WPF系统的时候发现的问题,刚刚开始自己的电脑都不能重现,后面写日志跟踪才发现问题的所在.问题主要是由于:1. 在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问, ...
- WPF .NET 4.0 OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) BUG解决
在项目 App.xaml 文件下 => Application 节点=> 添加 DispatcherUnhandledException="Application_Dispa ...
- python 操作剪切板
python3 在使用网上找到的一些使用剪切板的片段时发现存在写入剪切板后乱码的情况, 研究后发现python3不能使用SetClipboardData方法, 要使用SetClipboardText ...
- 【Windows API】OpenClipboard --- 剪切板(转)
原文转自 http://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html 剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其 ...
- wpf 复制/剪切到本地系统剪切板中以供右键粘贴用
原文:wpf 复制/剪切到本地系统剪切板中以供右键粘贴用 http://www.cnblogs.com/yhdkzy/archive/2012/11/27/2790655.html /// & ...
- 监视 Windows 剪切板
一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...
- 【笨嘴拙舌WINDOWS】实践检验之剪切板查看器【Delphi】
该程序能够监视Windows剪切板的内容(文字和图片) 其思路是 先调用SetClipBoardViewer(Self.Handle),让Windows剪切板内容发生改变之后,通知本程序: 然后截获W ...
- C# 使用WinApi操作剪切板Clipboard
前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...
- C++打开剪切板,获取剪切板数据
if (::OpenClipboard(NULL) && ::IsClipboardFormatAvailable(CF_HDROP)) { HDROP hDrop = (HDROP) ...
随机推荐
- StarUML license key
参考博客:http://blog.csdn.net/Excing/article/details/48998891 方法 将StarUML/www/license/node/LicenseManage ...
- 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗
碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...
- 多线程之异步编程: 经典和最新的异步编程模型,async与await
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- Shiro-HelloWord
HelloWorld Shiro的HelloWorld不是我们写的,而是看Shiro给我们提供的一段代码.通过这段代码可以看到Shiro大致的使用方式. 1.找到Shiro的jar包 目前的最新稳定版 ...
- 未知宽度的div水平居中
淘宝分页: div{position:relative; left:50%; float:left;} p{position:relative; left:-50%;}
- linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】
如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...
- 网站引入了css样式文件能访问,就是没有效果
今天后端的同事遇到这么个问题,引入了外部css文件也能访问,就是页面上没有效果. 大概是下面这个样子: css引入如下: 我非常的纳闷,说真的我还没遇到过这种情况,UI是可以运行的,一点事都没有... ...
- web前端基础知识-(八)Ajax
Ajax即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = 异步 Ja ...
- coreseek操作
开启服务$ /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf 重新索引: /usr/local/coresee ...
- linux 基础命令与文件管理
Linux终端介绍 Shell提示符 Bash Shell基本语法 基本命令的使用:ls.pwd.cd 查看系统和BIOS硬件时间 Linux如何获得帮助 Linux关机命令:shutdow.in ...