我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过。”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的。

如果是一些有X年工作经验(X永远不可能大于100)的程序员肯定会说:“你怎么这么不成熟?”你如果被别人这么说之后,不知道你会不会很伤心,或者很生气?

我呢,曾经被N个人这样教育过,不过你猜猜我当时的心情,我非常高兴,喜悦。为什么呢?

你不妨想想,当一个人说你不成熟的时候,你说他其实在说什么,他其实是在说他自己很成熟,就因为他自己熟得快腐烂了,满身恶臭,才会显得你不成熟,仔细想想,是不是这个事儿?

那么,成熟到底好不好呢?我相信小学生都有这样的常识,当一个果子熟透了的时候,会怎么样?它会从树枝上高空坠落,然后狠巴巴地摔到地上,粉身碎骨。呵呵,所以,你现在明白了吧,当别人说我不成熟的时候,我会非常高兴,我心里想:“快了快了,你快完蛋了。”

----------------------------------------------------------------------------------------------------------------

好,牛皮吹完,乐一乐。下面开始干正事,今天咱们来认识一下怎么操作粘贴板,即复制和粘贴数据。我不知道大家看不看恐怖片,反正我现在不得不吓你一回。这个粘贴板的操作,其实挺痛苦的,所以,如果在实际开发中,我肯定用CLR的类来弄,是的,这是我的做事原则,哪种方法最简单就用哪种,这叫什么?效率最大化,只有闲着没事干的人才会简单问题复杂化。

不过呢,毕竟这里咱们要了解一下在Win32下操作粘贴板的,所以呢,我还是用API来解决,至于CLR方法,相信你比我更会用,你不信算了,反正我信了,我不是菜鸟,但我是菜鹤。

读写粘贴板就像我们上厕所一样,首先打开厕所门(调用OpenClipboard函数),然后大动作(SetClipboardData或GetClipboardData),干完了出来,关上厕所门(调用CloseClipboard)。

我说它有点痛苦是因为操作的时睺,与我们平常读写一些数据不同,数据写入到剪贴板后就由操作系统接管了,期间你不能任意读写,就像公共厕所是提供给你用的,你不能在里面给人家装修,拆掉人家的东西。

一、复制数据

我这里就不弄太复杂了,就复制一串文本吧,这也常用。先看看代码。

  1. //复制内容
  2. //打开剪贴板
  3. OpenClipboard(hdlg);
  4. //清空剪贴板
  5. EmptyClipboard();
  6. //向剪贴板中放东西
  7. HWND hedt = GetDlgItem(hdlg, IDC_EDTCPY);
  8. WCHAR ntext[100];
  9. SendMessage(hedt, WM_GETTEXT, (WPARAM)100, (LPARAM)ntext);
  10. //分配内存
  11. HGLOBAL hgl = GlobalAlloc(GMEM_MOVEABLE, 100 * sizeof(WCHAR));
  12. LPWSTR lpstrcpy = (LPWSTR)GlobalLock(hgl);
  13. memcpy(lpstrcpy, ntext, 100 * sizeof(WCHAR));
  14. GlobalUnlock(hgl);
  15. SetClipboardData(CF_TEXT, lpstrcpy);
  16. //关闭剪贴板
  17. CloseClipboard();

大家看到,在打开剪贴板后,要先清空一下,调用EmptyClipboard函数,把里面的东西清了,才能放东西进去。但是我们不能直接用SetClipboardData设置数据,不然你试试,会失败,因为数据虽然是我们放进去的,但他归系统管,虽然我们的房子是自己买的,但也归小区物业公司管理。

因此,我们要通过内存拷贝来完成,GlobalAlloc函数分配全局内存块,不过标志参数要用GMEM_MOVEABLE,为什么,看MSDN怎么说的。

你可能会问,SetClipboardData中的参数是HANDLE类型的,为什么不用转换就能与

If SetClipboardData succeeds, the system owns the object identified by the hMem parameter. The application may not write to or free the data once ownership has been transferred to the system, but it can lock and read from the data until the CloseClipboard function is called. (The memory must be unlocked before the Clipboard is closed.) If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.

这段话不知道你看懂了没有,反正我看不懂,很难翻译,干脆不译了。就是这段话告诉了我们,用GlobalAlloc分配内存时要用GMEM_MOVEABLE标志。既然内存是动的(当然物理内存是固定的),那我们在拷贝前当然要把它锁定,拷贝完了再解锁,防止这块内存被外星人意外修改了。

二、粘贴数据

复制完了,就粘贴了。

  1. else if(LOWORD(wParam) == IDC_BTNPAST)
  2. {
  3. HWND hedtPas = GetDlgItem(hdlg, IDC_EDTPAST);
  4. OpenClipboard(hdlg);
  5. //判熂是否为文本内容
  6. if(IsClipboardFormatAvailable(CF_TEXT))
  7. {
  8. //取出数据
  9. HGLOBAL hg = GetClipboardData(CF_TEXT);
  10. //锁定内存块
  11. LPWSTR wstr = (LPWSTR)GlobalLock(hg);
  12. if(wstr != NULL)
  13. {
  14. SendMessage(hedtPas, WM_SETTEXT, NULL, (LPARAM)wstr);
  15. }
  16. GlobalUnlock(hg);
  17. }
  18. CloseClipboard();
  19. }

这里干吗要用IsClipboardFormatAvailable来检测一下剪贴板中是不是CF_TEXT格式的数据呢?因为在你复制了文本后,有可能在这期间其他程序把其他数据放到剪贴板上了,所以,要检查一下好,谨慎一点总是没有错的。

也许你会问,GetClipboardData不是返回HANDLE类型吗?怎么可以赋给HGLOBAL类型的变量而不用转换呢,你把开对应头文件看看就懂了,HGLOBAL就是HANDLE。

好了,就这样吧,只要你简单了解操作过程就够了,不必深究,呵呵,因为有比这更简单的方法。

跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作的更多相关文章

  1. 跟我一起玩Win32开发(转自CSDN-东邪独孤)

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  2. 跟我一起玩Win32开发(17):启动和结束进程

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...

  3. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  4. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

  5. iOS开发之--复制粘贴功能

    复制粘贴功能,代码如下: 1.复制功能 UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = ...

  6. Android 复制 粘贴 剪贴板的使用 ClipboardManager

    Copy and Paste 版本:Android 4.0 r1  快速查看 用于复制粘贴数据的基于剪贴板的框架. 同时支持简单和复杂的数据,包括文本串.复杂的数据结构.文本和二进制流数据.程序 as ...

  7. 跟我一起玩Win32开发(19):浏览和打开文件

    在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...

  8. 跟我一起玩Win32开发(25):监视剪贴板

    自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...

  9. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...

随机推荐

  1. android Graphics类:概述及基本几何图形绘制

    当须要在Android上绘制图形时.就会用到Graphics类.Paint类.Paint就是相当于笔,而Canvas就是 纸.这里叫画布. 所以,凡有跟要要画的东西的设置相关的.比方大小,粗细,画笔颜 ...

  2. Linux安装配置Redis CentOS 7 下安装Redis

    Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...

  3. UVA - 11019 Matrix Matcher hash+KMP

    题目链接:传送门 题解: 枚举每一行,每一行当中连续的y个我们hash 出来 那么一行就是 m - y + 1个hash值,形成的一个新 矩阵 大小是 n*(m - y + 1), 我们要找到x*y这 ...

  4. mac的终端窗口的工作组的使用

    1.打开终端,打开多个tab,分别进入目录, 2.点击窗口,将窗口存储为组,弹窗如下图 可以勾选恢复所有命令,存储 3.下次使用时,点击窗口,打开工作组即可

  5. spring MVC (学习笔记)

    web.xml 相关配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns=" ...

  6. Mac OS安装Scrapy

    个人觉得掌握简单的爬虫知识非常有用,特别是想要从一些特定网站自动地下载一些资源或者统计一些数据,非常的有用.对于产品经理来说,如果要了解竞争产品.替代产品的价格,可以写一个爬虫脚本从各大电商网站爬取相 ...

  7. idea 破解注册方法总结

    注册码(无期限) JetbrainsCrack-2.6.2.jar适用于ideaIU-2017.2.之前版本,若版本较新适用 JetbrainsCrack-2.6.3_proc.jar. 其中Jetb ...

  8. safi 中placeholder不垂直居中

    用css hack将line-height 设置为1 例子: input{height: 32px; line-height: 32px; [;line-height: 1px;]};

  9. web开发中的mysql使用

    一.单机mysql与mysql集群 1. 单机mysql很好理解,在一台物理机上安装好mysql服务端程序,使用这一台机器的硬件(cpu,内存,硬盘)进行数据的处理. 2.mysql集群 MySQL集 ...

  10. 自定义custom Tab Bar

    iOS提供的Tab Bar比较简单,我们常常有些别样的需求,此时往往需要自行自定义Tab Bar,如下图所示:                           如图所示,需要在某个页面中添加一个类 ...