WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))

最近碰到一个问题,需要弄个小工具来解决。刚好接触到WPF,于是就想通过WPF来实现。
    在这个过程中想通过程序将一些东西复制到剪切板中,代码很简单:Clipboard.SetText(lineTexts[lineIndex]);就这一句,想把lineTexts这个字符串List中的第lineIndex项复制到剪切板中,但是运行的时候就会抛出异常,大致的异常信息是“OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))”(挺长的一段,注意没写全)。而winform那边之前也用过,没有问题。
    上网搜索了一下,看了挺多资料,发现是WPF本身对Clipboard处理的问题,在.Net4.0及之前的版本中都有问题,最近Micorsoft已经在.Net4.5中修复了。问题主要是由于:在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问,从而抛出异常。
    在.Net4.0上,解决这个问题,我大概总结了一下,有下面几种方法:

  1. 自行截获异常,进行处理
         for (int i = 0; i < 10; i++)
{
try
{
Clipboard.SetText(lineTexts[lineIndex]);
break;
}
catch
{
System.Threading.Thread.Sleep(10);//这句加不加都没关系
              }
}

这种方法处理过程中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))相关推荐

  1. WPF .NET 4.0 OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) BUG解决

    WPF .NET 4.0 OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) BUG解决 参考文章: (1)WPF .NE ...

  2. 进程的通信 - 剪切板

    剪切板是系统维护管理的一块内存区域,本机的所有进程都可以访问.当一个进程复制数据时,先将数据放在该内存区,当另一个进程粘贴时,则是从该内存区块取出数据 剪切板操作: 其实在剪切板中也就那几个API在使 ...

  3. Python3中使用windows剪切板

    python3 在使用网上找到的一些使用剪切板的片段时发现存在写入剪切板后乱码的情况, 研究后发现python3不能使用SetClipboardData方法, 要使用SetClipboardText ...

  4. Python使用Windows剪切板

    pywin32 for py2.7 下载:http://pan.baidu.com/s/1i5gjs1J 1.文本内容 # coding=utf-8import win32clipboard as w ...

  5. WPF写入剪切板时报异常

    问题: WPF中执行下述语句: Clipboard.SetText("something"); 报异常: OpenClipboard 失败 (Exception fromHRESU ...

  6. WINDOWS API——OPENCLIPBOARD——剪切板

    剪切板:系统维护的一个全局公共内存区域,每次只允许一个进程对其进行访问. 剪切板操作方法如下:(MSDN上搜索Clipboard Operations) 1.打开剪切板 Bool OpenClipbo ...

  7. VC非ASCII语言复制到剪切板乱码问题

    MFC版本 今天遇到奇怪的现象,日文系统下在控件上按下Ctrl+C,再粘贴出来得到乱码,非得切换到日文输入法再进行粘贴不可.经过代码分析,得出结论是剪切板SetClipboardData()时自动内存 ...

  8. C++和C#实现剪切板数据交互

    c#端由于system.windows.form自带的剪切板功能太少,所以写了一个Helper类把接口转了出来.这样就可以用不同的uint的id了. 并且自带的剪切板必须执行在[STAThread]模 ...

  9. Python监听剪切板的两种方法

    第一种 import win32clipboard import time #速度快 容易出错 class niubi():def lihai(self):while True:#jianting() ...

  10. windows剪切板暂存

    其实最初是因为在项目中使用了html网页编辑器,通过ie的com组件和javascript通讯完成一些事情,其中有一个功能是插入表格,我们原本使用的range.pasteHTML(HTMLstr);根 ...

最新文章

  1. php 进程管理,php如何管理进程
  2. 使用DbVisualizer连接和管理金仓数据库
  3. android视频教程
  4. signature=14a3e4f784cf9004647ea52bac22e550,维族老年慢性阻塞性肺疾病患者合并肺动脉高压的临床研究...
  5. 3. 线性表的链式结构
  6. position学习终结者(一)
  7. [LeetCode] Reverse Linked List 倒置链表
  8. C#(int)中Convert、Parse、TryParse的区别
  9. 电脑画图和计算机不见了,电脑中自带的Window画图工具不见了如何恢复
  10. Linux虚拟机的安装与创建【超详细】【手把手教学】
  11. 记录MySQL中JSON_EXTRACT JSON_UNQUOTE函数的使用方式
  12. POJ 3537.Crosses and Crosses(定义sg函数)
  13. Redis:Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use
  14. VMware Guided Consolidation
  15. 树莓派cm3+的i2c使用总结
  16. 初识c语言加操作系统
  17. 如何计算近似纳什均衡_澳洲计算机网络安全课程之-莫纳什大学硕士课程
  18. 计算机一级怎么上网题怎样保存页面,全国计算机一级上网操作题知识点
  19. 基于layui和ThinkPHP6开发的通用后台管理框架
  20. 解决ORA-01034/ORA-27101

热门文章

  1. oracle的解释计划,oracle解释执行计划-Oracle
  2. oracle执行计划中cost cpu
  3. 7.Redis过期策略底层是如何实现的?
  4. 电解电容串联的均压电阻计算
  5. 在html用微信跳转,H5如何跳转微信小程序?
  6. etc fstab 详解linux,Linux下/etc/fstab文件详解
  7. 微信H5开发wx.config授权invalid signature
  8. mariadb 的安装及基本配置
  9. 虚拟机客户端访问不了服务器域名,虚拟机ESXI 篇四:让你电脑打开网页不用等待---SmartDns...
  10. 头条号如何提高文章推荐量和阅读量,头条号提高文章阅读量和推荐量的方法