操作windows剪切板,写入正常,粘贴出来时候乱码了。

之前的代码:

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 ;
}

剪切板SetClipboardData()时自动内存转换,默认状态下并不能识别双字节的字符.
所以修改的思路是,先统统转成宽字符,再按照宽字符进行拷贝.

改后的代码:

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();
}

转自网络,备忘。

写入windows剪切板,粘贴出来乱码相关推荐

  1. Windows 剪切板的应用——复制浏览器or本地目录图片

    一.简述 最近看了windows的剪切板相关的应用代码,于是乎,便想将浏览器中复制的图片保存到本地,经过尝试,通过以下代码完成在浏览器中右键选择复制图片,然后监控键盘事件,当按下Ctrl + v 时保 ...

  2. windows剪切板文本和文件的获取设置

    介绍 windows剪切板的内容包含很多不同的格式,例如:CF_TEXT.CF_BITMAP.CF_METAFILEPICT.CF_SYLK.CF_DIF.CF_TIFF.CF_OEMTEXT.CF_ ...

  3. 如何获取windows剪切板中内容

    一个简单的获取windows剪切板中文本内容的代码 // 获取剪切板中的内容public static String getClipboardText() {Clipboard clip = Tool ...

  4. 如何对Windows剪切板里的内容进行取证分析 Windows剪切板取证

    前言 无论是在现实中对设备进行取证分析,还是在ctf中做取证类的题目,剪切板里的内容都需要去查看,以免遗漏什么重要信息 剪切板位置 剪切板是计算机操作系统提供的一个临时存储区域,用于在不同应用程序之间 ...

  5. matlab复制矢量图形,Matlab4.2b提供了将wmf格式矢量图复制到Windows剪切板.doc

    Matlab4.2b提供了将wmf格式矢量图复制到Windows剪切板.doc Matlab 4.2b提供了将wmf格式矢量图复制到Windows剪切板的功能,可以将它直接粘贴到Word文档中而不发生 ...

  6. 从剪切板粘贴图片上传

    一个需求:让用户使用剪切板来粘贴图片(而不是将图片保存到本地,然后再选取文件上传) fakepath是什么鬼 今天做图片上传时发现,不论是什么路径上传的文件,路径都变成了这种格式 "C:\f ...

  7. windows剪切板的历史记录

    windows剪切板的历史记录 最近遇到一件比较坑的事情.当然可能也是我本人粗心大意了吧.但是这种事情难免要发生.比如说你要移动一个比较重要的东西,然后按了ctrl+x,但是之间因为别的事情耽搁了一下 ...

  8. windows剪切板api

    Windows 剪切板API详解 (一) ChangeClipboardChain  将剪贴的连接从一个句柄转到下一个句柄.  BOOL ChangeClipboardChain(  HWND hWn ...

  9. Python3中使用windows剪切板

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

最新文章

  1. tensorrt优化笔记
  2. criscriter英语测试软件,iTEST大学英语测试与训练系统
  3. 产品经理和程序员的黑话
  4. [转]踏实从小事做起, 才能有大发展
  5. php编译时出错make: *** [libphp5.la] Error 1
  6. 每日小记2017.9.4
  7. java 关于JDBC和DAO模式使用
  8. HOHO 拿了個小嘉獎 Happy一下 可惜過年可能被留下...痛苦
  9. Python3爬虫项目集:豆瓣电影排行榜top250
  10. 解决在局域网内QQ传文件慢的问题(转)
  11. 3D打印切片软件cura使用
  12. 代码-检测文件的编码
  13. B站粉丝数显示器,播放数、获赞数失效解决。
  14. SpringBoot Kafka工具类封装
  15. 二手苹果手机价格一览表
  16. 计算机无法u盘启动,电脑无法从u盘启动怎么办呢?
  17. 数值分析课程主要学习内容总结
  18. 天池-金融风控训练营-task5-模型融合
  19. 计算机毕业生寄语老师,计算机学院辅导员手写370张贺卡寄语毕业生
  20. 虾皮Shopee本土店如何店群系统操作及运营

热门文章

  1. clipboard.js,点击复制到系统剪切板,适合移动端、PC端复制
  2. java连接数据库的进阶操作
  3. android RecyclerView实现查看更多及收起
  4. 开源视频会议白板系统-openMeetings 6.2 局域网搭建官方教程
  5. win10系统运行vc6.0编译后的程序报:“0xc000007b应用程序无法正常启动”的解决方法
  6. python 黑盒测试_处理Python导入黑盒
  7. C++ 之 constexpr和常量表达式
  8. mysql中中decode用法_MySQL 中的 DECODE 函数的实现
  9. VS2008安装失败解决方案(转)
  10. SQL2008安装重启失败解决方法