MFC版本

今天遇到奇怪的现象,日文系统下在控件上按下Ctrl+C,再粘贴出来得到乱码,非得切换到日文输入法再进行粘贴不可.经过代码分析,得出结论是剪切板SetClipboardData()时自动内存转换惹的祸.这家伙默认状态下并不能识别双字节的字符.
所以修改的思路是,先统统转成宽字符,再按照宽字符进行拷贝.

之前的代码:

BOOL    CopyStringToClipBoard( HWND hOwner, CString strSource )
{if( ::OpenClipboard(hOwner) ){HANDLE clipbuffer ;char *buffer ;::EmptyClipboard() ;clipbuffer = ::GlobalAlloc( GMEM_DDESHARE,strSource.GetLength()+1 ) ;buffer = (char*)::GlobalLock(clipbuffer) ;strcpy( buffer, LPCSTR(strSource) ) ;::GlobalUnlock(clipbuffer) ;::SetClipboardData(CF_TEXT, clipbuffer) ;::CloseClipboard() ;} return FALSE ;
}

修改之后的代码:

BOOL   CopyStringToClipBoard( HWND hOwner, CString strSource )
{if( ::OpenClipboard(hOwner) ){int buff_size = strSource.GetLength() ;CStringW strWide = CStringW(strSource);int nLen = strWide.GetLength();HANDLE clipbuffer ;char* buffer;::EmptyClipboard() ;clipbuffer = ::GlobalAlloc( GMEM_DDESHARE, (nLen + 1) * 2 ) ;buffer = (char*)::GlobalLock(clipbuffer) ;memset(buffer, 0, (nLen + 1) * 2);memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen* 2 );strWide.ReleaseBuffer();::GlobalUnlock(clipbuffer) ;::SetClipboardData(CF_UNICODETEXT, clipbuffer) ;::CloseClipboard() ;} return FALSE ;
}

///

C++  SDK UNICODE版本

TCHAR g_szCode[0x200]= { 0 };
if(OpenClipboard(NULL)){EmptyClipboard();// 此处用_tcslen得到字符串的实际长度 没有计算最后的结尾符号\0\0 但是剪切板以及_tcscpy_s函数规定字符串最后是以\0\0结尾//所以这里加1预留出新字符串结尾符号的空间SIZE_T nSize = _tcslen(g_szCode) + 1;         // 申请内存的空间大小 这里是字节来计算 所以需要把字符串实际长度 * 每个字符所占用的空间  UNICODE是2个字节 所以TCHAR就代表2HGLOBAL hClip=GlobalAlloc(GMEM_DDESHARE, nSize * sizeof(TCHAR));PTSTR pszBuf=(PTSTR)GlobalLock(hClip);// 这里是以字符数量来复制的 nSize是pszBuf中字符数量的大小 g_szCode的字符数量比nSize小1一个字符 用于_tcscpy_s函数最后需要追加\0\0// 由于_tcscpy_s会自动在新字符串上追加结尾符号\0\0 所以这里nSize的大小必须比g_szCode大1 且nSize是pszBuf的实际空间大小_tcscpy_s(pszBuf, nSize, g_szCode);GlobalUnlock(hClip);   SetClipboardData(CF_UNICODETEXT, hClip);CloseClipboard();}

注意:如果这里的_tcscpy_s字符没有设置正确 这句代码很可能不会报错 但是在后边的SetClipboardData会报错 这样的错误不容易查找

VC非ASCII语言复制到剪切板乱码问题相关推荐

  1. html数据复制到剪切板

    一.原生js指令复制 function copyUtil(info) {var $textArea = $('<textarea></textarea>');$textArea ...

  2. 微信小程序复制到剪切板及换行问题

    wxml <textarea type="text" v-model="copyContent" placeholder="请输入内容" ...

  3. clipboard.js 实现动态获取内容并复制到剪切板

    一个按钮实现先ajax请求,再实现复制功能: 使用clipboard.js分为以下几个步骤: 1.引入一个clipboard.js的文件: 2.新建一个clipboard对象: 3.点击按钮获取目标对 ...

  4. 将内容复制到剪切板兼容主流浏览器的解决方案

    html : <body><div class="demo-area"><label for="copy-input">输入 ...

  5. 微信小程序_把chatgpt聊天数据复制到剪切板

    文章目录 ⭐ 前言 ⭐ 开始 网格背景样式配置 对话框样式配置 复制到剪切板 ⭐ 结束 ⭐ 前言 大家好,我是yma16,不止前端,本文将介绍微信小程序中 chatgpt聊天页面设计和复制聊天数据. ...

  6. 微信小程序之一键复制到剪切板

    最近在开发小程序项目里遇到一个小难题-----一键复制 在网页开发里 我们可以引用大牛封装好的复制插件,比如无flash插件clipboard.js适用移动端,pc端------- 言归正装,打开微信 ...

  7. VC 操作word部分代码(利用剪切板取得Word中的图片,ClipBoard, Addpicture)

    在32位WIN7 VS2012环境下测试通过,在64位WIN7 VS2013环境下GlobalLock和GlobalSize函数返回NULL,具体参见注释 // 读取给定文件名的Doc文档中的数据 B ...

  8. Android将内容复制到剪切板

    近期,项目里需要用到将部分内容复制到剪切板,以前用到都是随用随找,挺麻烦的,最近整理一下,在这里记录一下 其实Android提供的剪贴板框架,Android提供ClipboardManager.Cli ...

  9. Html将内容复制到剪切板.

    Html将内容复制到剪切板. 引入clipboard.min.js /*!* clipboard.js v1.6.1* https://zenorocha.github.io/clipboard.js ...

最新文章

  1. tensorflow-gpu
  2. 华人打造二次元老婆生成器!尔康容嬷嬷成萌妹,图像视频都能变 | Demo可玩
  3. rest-framework 解析器
  4. 1995 年乔布斯访谈:什么对产品最重要
  5. python实现什么功能_Python 实现WC功能
  6. Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)心得分享
  7. Python字符串| isdigit()方法与示例
  8. 贪吃蛇程序不要白不要,一个赞就够了
  9. java 在已有的so基础上封装jni_webshell中的分离免杀实践java篇
  10. 计算机应用软件安装教程,计算机应用与网基础教程 常用软件安装.ppt
  11. java react_Java 9React流
  12. YYText识别链接和点击事件
  13. python均线斜率_一根20日均线闯天下——量化回测“压箱底指标”,值得散户认真研读...
  14. App自动化测试之企微打卡、快手刷金币
  15. JIRA Service Desk获得 ITIL 认证
  16. 社工工具包 SEToolkit
  17. 电脑硬件升级完全解决方案-1
  18. OGRE+CG学习日记[1]-简单的3D程序
  19. Kotlin -by 详解
  20. Scapy用法官方文档

热门文章

  1. Java对象的创建、内存布局和访问定位
  2. 俄罗斯将用机器人当探月先锋
  3. 【Linux 操作系统】 Secure CRT 终端配置 -- 配置语法高亮 光标 和 字体
  4. StringBuilder类型的基本用法
  5. Arrays.asList详解
  6. camelot工具进行pdf表格解析重建
  7. 如何让squid实现动态缓存
  8. Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
  9. oracle11g 启动报错 缺少系统参数
  10. mysql----Linux下安装