异常信息“OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN

WPF本身对Clipboard处理的问题,在.Net4.0及之前的版本中都有问题,在.Net4.5中修复了,但XP下安装不了.NET4.5,而我的程序又必须在XP下运行。

问题主要是由于:在程序访问剪切板的时候,有其他程序正在占用剪切板,导致自己的程序无法访问,从而抛出异常。

自行截获异常,进行处理

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;

}

4.使用winform剪贴板

System.Windows.Forms.Clipboard.SetText(txt2.Text);

看一下WinForm和WPF的代码

WinForm的SetText()最终会调用SetDataObject(data, copy, 10, 100),这个是SetDataObject()的签名:

[UIPermission(SecurityAction.Demand, Clipboard=UIPermissionClipboard.OwnClipboard)]

public static void SetDataObject(object data, bool copy, int retryTimes, int retryDelay)

{

if (Application.OleRequired() != ApartmentState.STA)

{

throw new ThreadStateException(SR.GetString("ThreadMustBeSTA"));

}

if (data == null)

{

throw new ArgumentNullException("data");

}

if (retryTimes < 0)

{

object[] args = new object[] { "retryTimes", retryTimes.ToString(CultureInfo.CurrentCulture), 0.ToString(CultureInfo.CurrentCulture) };

throw new ArgumentOutOfRangeException("retryTimes", SR.GetString("InvalidLowBoundArgumentEx", args));

}

if (retryDelay < 0)

{

object[] objArray2 = new object[] { "retryDelay", retryDelay.ToString(CultureInfo.CurrentCulture), 0.ToString(CultureInfo.CurrentCulture) };

throw new ArgumentOutOfRangeException("retryDelay", SR.GetString("InvalidLowBoundArgumentEx", objArray2));

}

DataObject obj2 = null;

if (!(data is IDataObject))

{

obj2 = new DataObject(data);

}

bool flag = false;

try

{

IntSecurity.ClipboardRead.Demand();

}

catch (SecurityException)

{

flag = true;

}

if (flag)

{

if (obj2 == null)

{

obj2 = data as DataObject;

}

if (!IsFormatValid(obj2))

{

throw new SecurityException(SR.GetString("ClipboardSecurityException"));

}

}

if (obj2 != null)

{

obj2.RestrictedFormats = flag;

}

int num2 = retryTimes;

IntSecurity.UnmanagedCode.Assert();

try

{

int num;

do

{

if (data is IDataObject)

{

num = UnsafeNativeMethods.OleSetClipboard((IDataObject) data);

}

else

{

num = UnsafeNativeMethods.OleSetClipboard(obj2);

}

if (num != 0)

{

if (num2 == 0)

{

ThrowIfFailed(num);

}

num2--;

Thread.Sleep(retryDelay);

}

}

while (num != 0);

if (copy)

{

num2 = retryTimes;

do

{

num = UnsafeNativeMethods.OleFlushClipboard();

if (num != 0)

{

if (num2 == 0)

{

ThrowIfFailed(num);

}

num2--;

Thread.Sleep(retryDelay);

}

}

while (num != 0);

}

}

finally

{

CodeAccessPermission.RevertAssert();

}

}

而WPF的SetText(),虽然签名一样,但是具有完全不同的实现:

[SecurityCritical]

public static void SetDataObject(object data, bool copy)

{

SecurityHelper.DemandAllClipboardPermission();

CriticalSetDataObject(data, copy);

}

[FriendAccessAllowed, SecurityCritical]

internal static void CriticalSetDataObject(object data, bool copy)

{

IDataObject obj2;

if (data == null)

{

throw new ArgumentNullException("data");

}

if (data is DataObject)

{

obj2 = (DataObject) data;

}

else if (data is IDataObject)

{

SecurityHelper.DemandUnmanagedCode();

obj2 = (IDataObject) data;

}

else

{

obj2 = new DataObject(data);

}

int num2 = 10;

while (true)

{

int hr = OleServicesContext.CurrentOleServicesContext.OleSetClipboard(obj2);

if (NativeMethods.Succeeded(hr))

{

break;

}

if (--num2 == 0)

{

Marshal.ThrowExceptionForHR(hr);

}

Thread.Sleep(100);

}

if (copy)

{

Thread.Sleep(10);

Flush();

}

}

wpf 复制到粘贴板_WPF Clipboard剪贴板缺陷解决方案相关推荐

  1. ios下js复制到粘贴板_h5实现一键复制到粘贴板 兼容ios

    实现原理 采用document.execCommand('copy') 来实现复制到粘贴板功能 复制必须是选中input框的文字内容,然后执行document.execCommand('copy') ...

  2. h5实现一键复制到粘贴板 兼容iOS

    copyText = (text) => {// 数字没有 .length 不能执行selectText 需要转化成字符串const textString = text.toString();l ...

  3. html 一键复制 ios,h5实现一键复制到粘贴板-兼容ios

    实现原理 采用document.execCommand('copy')来实现复制到粘贴板功能 复制必须是选中input框的文字内容,然后执行document.execCommand('copy')命令 ...

  4. h5 实现一键复制到粘贴板 兼容iOS

    效果展示 先贴上测试连接 http://cdn.foundao.com/zhaosheng/copytext 实现原理 采用 document.execCommand('copy') 来实现复制到粘贴 ...

  5. Qt实现一个简易截图工具(支持缩放、移动、保存、复制到粘贴板)

    概述 windows平台,使用Qt Widget实现一个简易截图工具,支持选区角落拖动缩放.选区移动,支持保存,复制到粘贴板,支持快捷键调出截图.退出截图.暂不支持对截图进行编辑操作,以及鼠标移动到程 ...

  6. tkinter的Treeview使用,tkinter的网格图形界面,包括排序,复制到粘贴板,导出excel,以及右键弹出菜单

    第一次用CSDN,有不好的请见谅. 这里的treeview是做GUI的表格界面,.net里很简单,拖个控件就解决了,但tkinter里还蛮麻烦的,连复制粘贴都得自己写进去,最后实现的效果如下: 我自己 ...

  7. 通过纯js代码实现将指定内容复制到粘贴板(兼容各主流浏览器)

    通过纯js代码实现将指定内容复制到粘贴板(兼容各主流浏览器) 1.业务需求: vue项目需要通过点击button按钮将指定内容复制到粘贴板中,且不引入第三方组件. 2.解决方案: js写法如下(这里是 ...

  8. autojs 复制到粘贴板_Clipboard.js无需Flash实现剪贴板功能

    全部代码如下 Clipboard.js无需Flash实现剪贴板功能 * {margin: 0; padding:0; font-family: '微软雅黑'} #con {width: 800px; ...

  9. ios下js复制到粘贴板_EXCEL被你忽视的粘贴板-11

    这一节我们来聊聊粘贴板的用途,什么?你居然没用过粘贴板?平时只是ctrl+c,然后ctrl+v,好吧,那我们看看粘贴板到底能干些啥. 1.提取区域内的内容 有时我们选择一块区域发给同事,但当他需要编辑 ...

最新文章

  1. 【数据结构】回顾散列表
  2. txt文件分解为固定条数的文件
  3. vnr光学识别怎么打开_干货|指纹锁的指纹识别模块的前世今生,智能锁的指纹识别到底有多智能?...
  4. map.addoverlay php,覆盖物 - 百度地图开发文档 - php中文网手册
  5. 【干货】深度学习及在推荐中的实践-美团点评.pdf(附下载链接)
  6. 操作系统读写者问题实验报告_备战秋招——操作系统(2)
  7. 利用最新的开源软件构建日志管理系统
  8. android坐标画图软件下载,几何平板Geometry Pad(绘图,测量数字坐标轴)2.7.0
  9. 架构师之路:如何做一个好的产品架构师
  10. mysql 删除数据 分页_使用limit分页查询时,做delete操作,会导致丢失数据
  11. 集线器,路由器,交换机的作用和区别是什么以及如何区分?
  12. windows 执行 bat命令问题
  13. 虹科Pico动态 |【盖世汽车-走进东风商用车技术展】精彩回顾
  14. C语言中?:代表什么意思
  15. java报错java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that
  16. 安装包中-win32-x86_64是什么意思?
  17. 【Python】从入门到入土2
  18. c语言中一个程序的运行过程
  19. 禹贡(Yukon)空间数据库 QA 集锦
  20. UIAutomator2.0详解(UIDevice篇----触屏操作1)

热门文章

  1. mysql服务启动报错:“服务读取描述失败,错误代码:2”的解决办法?
  2. 一文读懂滤波器的线性相位,全通滤波器,群延迟
  3. python二级第十套答案
  4. elemenUI 2.x:单选框控制日期选择器的切换
  5. mysql 时间差计算(时、分、秒)和js时间校验和时间转换为所输入时间的最后一秒
  6. 尚硅谷MySQL高级学习笔记
  7. Android 代码扫描工具
  8. opencv putText 参数说明
  9. powerShell修改输入字体颜色
  10. Jmeter修改颜色与字体大小