跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作
我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过。”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的。
如果是一些有X年工作经验(X永远不可能大于100)的程序员肯定会说:“你怎么这么不成熟?”你如果被别人这么说之后,不知道你会不会很伤心,或者很生气?
我呢,曾经被N个人这样教育过,不过你猜猜我当时的心情,我非常高兴,喜悦。为什么呢?
你不妨想想,当一个人说你不成熟的时候,你说他其实在说什么,他其实是在说他自己很成熟,就因为他自己熟得快腐烂了,满身恶臭,才会显得你不成熟,仔细想想,是不是这个事儿?
那么,成熟到底好不好呢?我相信小学生都有这样的常识,当一个果子熟透了的时候,会怎么样?它会从树枝上高空坠落,然后狠巴巴地摔到地上,粉身碎骨。呵呵,所以,你现在明白了吧,当别人说我不成熟的时候,我会非常高兴,我心里想:“快了快了,你快完蛋了。”
----------------------------------------------------------------------------------------------------------------
好,牛皮吹完,乐一乐。下面开始干正事,今天咱们来认识一下怎么操作粘贴板,即复制和粘贴数据。我不知道大家看不看恐怖片,反正我现在不得不吓你一回。这个粘贴板的操作,其实挺痛苦的,所以,如果在实际开发中,我肯定用CLR的类来弄,是的,这是我的做事原则,哪种方法最简单就用哪种,这叫什么?效率最大化,只有闲着没事干的人才会简单问题复杂化。
不过呢,毕竟这里咱们要了解一下在Win32下操作粘贴板的,所以呢,我还是用API来解决,至于CLR方法,相信你比我更会用,你不信算了,反正我信了,我不是菜鸟,但我是菜鹤。
读写粘贴板就像我们上厕所一样,首先打开厕所门(调用OpenClipboard函数),然后大动作(SetClipboardData或GetClipboardData),干完了出来,关上厕所门(调用CloseClipboard)。
我说它有点痛苦是因为操作的时睺,与我们平常读写一些数据不同,数据写入到剪贴板后就由操作系统接管了,期间你不能任意读写,就像公共厕所是提供给你用的,你不能在里面给人家装修,拆掉人家的东西。
一、复制数据
我这里就不弄太复杂了,就复制一串文本吧,这也常用。先看看代码。
- //复制内容
- //打开剪贴板
- OpenClipboard(hdlg);
- //清空剪贴板
- EmptyClipboard();
- //向剪贴板中放东西
- HWND hedt = GetDlgItem(hdlg, IDC_EDTCPY);
- WCHAR ntext[100];
- SendMessage(hedt, WM_GETTEXT, (WPARAM)100, (LPARAM)ntext);
- //分配内存
- HGLOBAL hgl = GlobalAlloc(GMEM_MOVEABLE, 100 * sizeof(WCHAR));
- LPWSTR lpstrcpy = (LPWSTR)GlobalLock(hgl);
- memcpy(lpstrcpy, ntext, 100 * sizeof(WCHAR));
- GlobalUnlock(hgl);
- SetClipboardData(CF_TEXT, lpstrcpy);
- //关闭剪贴板
- 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标志。既然内存是动的(当然物理内存是固定的),那我们在拷贝前当然要把它锁定,拷贝完了再解锁,防止这块内存被外星人意外修改了。
二、粘贴数据
复制完了,就粘贴了。
- else if(LOWORD(wParam) == IDC_BTNPAST)
- {
- HWND hedtPas = GetDlgItem(hdlg, IDC_EDTPAST);
- OpenClipboard(hdlg);
- //判熂是否为文本内容
- if(IsClipboardFormatAvailable(CF_TEXT))
- {
- //取出数据
- HGLOBAL hg = GetClipboardData(CF_TEXT);
- //锁定内存块
- LPWSTR wstr = (LPWSTR)GlobalLock(hg);
- if(wstr != NULL)
- {
- SendMessage(hedtPas, WM_SETTEXT, NULL, (LPARAM)wstr);
- }
- GlobalUnlock(hg);
- }
- CloseClipboard();
- }
这里干吗要用IsClipboardFormatAvailable来检测一下剪贴板中是不是CF_TEXT格式的数据呢?因为在你复制了文本后,有可能在这期间其他程序把其他数据放到剪贴板上了,所以,要检查一下好,谨慎一点总是没有错的。
也许你会问,GetClipboardData不是返回HANDLE类型吗?怎么可以赋给HGLOBAL类型的变量而不用转换呢,你把开对应头文件看看就懂了,HGLOBAL就是HANDLE。
好了,就这样吧,只要你简单了解操作过程就够了,不必深究,呵呵,因为有比这更简单的方法。
跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作的更多相关文章
- 跟我一起玩Win32开发(转自CSDN-东邪独孤)
跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...
- 跟我一起玩Win32开发(17):启动和结束进程
这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...
- 跟我一起玩Win32开发(12):使用控件——单选按钮
今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...
- 跟我一起玩Win32开发(18):使用对话框的两个技巧
相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...
- iOS开发之--复制粘贴功能
复制粘贴功能,代码如下: 1.复制功能 UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = ...
- Android 复制 粘贴 剪贴板的使用 ClipboardManager
Copy and Paste 版本:Android 4.0 r1 快速查看 用于复制粘贴数据的基于剪贴板的框架. 同时支持简单和复杂的数据,包括文本串.复杂的数据结构.文本和二进制流数据.程序 as ...
- 跟我一起玩Win32开发(19):浏览和打开文件
在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...
- 跟我一起玩Win32开发(25):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
- 跟我一起玩Win32开发(4):创建菜单
也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...
随机推荐
- WCF服务端的.NET Core支持项目Core WCF 正式启动
长期以来在wcf客户端库 https://github.com/dotnet/wcf 里反应最强烈的就是.NET Core的服务端支持 https://github.com/dotnet/wcf/is ...
- Arcgis Engine(ae)接口详解(7):地图(map)操作
IMap map = null; //跟map同一层次的activeView对象,他们都是“地图”的对象,map管理地图内容,activeView管理显示内容 IActiveView activeVi ...
- cocos2d-x(vs2012)环境搭建(第一篇)[版本号:cocos2d-x-3.1.1]
1.下载资源 下载cocos2d-x包V3.1.1,下载戳这里: http://www.cocos2d-x.org/download vs2012下载戳这里: http://www.xiazaiba. ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- 两个月刷完Leetcode前400题经验总结
更新:气死了,挂个傻逼: 每次做个分享.组织个活动,就会有一些傻逼冒泡生怕别人不知道他是傻逼,气死我了!自己好好看看非法集资的概念,我办这个活动,一分钱都没收,入群99元是督促大家完成刷题任务,最后完 ...
- 使用zxing编写的二维码生成解析工具:QRCoder
zxing GitHub地址 QRCoder GitHub地址 TipDialog.java package com.wolf_pan; import java.util.Timer; import ...
- JUNO eclipse Version: 4.2.0 添加svn插件
1.下载最新的这个版本的SVN http://www.eclipse.org/subversive/latest-releases.php 实际的下载地址 http://www.eclipse.org ...
- 关于树论【动态树问题(LCT)】
搬运:看一道caioj1439 题目描述 一开始给你一棵n个点n-1条边的树,每个点有一个权值wi. 三种操作: op=1 u v :在点u和点v之间建一条边. op=2 u v:摧毁点u到点v之间的 ...
- vue中手机号,邮箱正则验证以及60s发送验证码
今天写了一个简单的验证,本来前面用的组件,但是感觉写的组件在此项目不是很好用,由于用到的地方比较少,所以直接写在了页面中.页面展示如图 <div> <p class=&quo ...
- java 简单贪吃蛇
1. [代码]java 简单程序 跳至 [1] [全屏预览]package com.snake;import java.awt.*;import javax.swing.*;import ja ...