当前位置:首页 > 芯闻号 > 充电吧
[导读]剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其进行访问。剪切板操作方法如下:(MSDN上搜索Clipboard Operations)1.打开剪切板Bool OpenClipboard

剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其进行访问。

剪切板操作方法如下:(MSDN上搜索Clipboard Operations)

1.打开剪切板
Bool OpenClipboard(HWND hWndNewOwner);
  指定关联到打开的剪切板的窗口句柄,传入NULL表示关联到当前任务。每次只允许一个进程打开并访问。

每打开一次就要关闭,否则其他进程无法访问剪切板。


2.清空剪切板
Bool EmptyClipboard(void)

  写入前必须先清空,得到剪切板占有权

3.分配内存
HGLOBAL GlobalAlloc(UINT uFlags, SIZE_T dwBytes);
  在堆上动态分配以字节为单位的内存区域。成功则指向该内存,失败NULL。参数:1.分配内存属性, 2.分配的大小


4.锁定内存
LPVOID GlobalLock(HGLOBAL hMem);
  锁定由GlobalAlloc分配的内存,并将内存对象的锁定计数器+1,成功返回指向内存对象起始地址的指针。失败NULL

系统为每个全局内存对象维护一个锁定计数器,初始为0,GlobalLock使计数器+1,GlobalUnLock计数器-1.一旦计数器值大于0,

这块内存区域将不允许被移动或删除,只有当为0时,才解除对这块内存的锁定。如果分配时GMEM_FIXED属性,计数器一直为0

5.设置剪切板
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

  执行成功,返回数据句柄,否则返回NULL

6.解除锁定
BOOL GlobalUnlock(HGLOBAL hMem);
  将GlobalAlloc分配的属性为GMEM_MOVEABLE的内存对象计数器-1.

 

7.关闭剪切板
Bool CloseClipboard(void);

  必须关闭剪切板其他进程才能使用剪切板,且关闭后当前进程就不能写入数据。

8.获取剪切板数据
HANDLE GetClipboardData(UINT uFormat);

  执行成功,返回数据句柄,否则返回NULL数据格式,指定格式的数据的句柄

 

一:UINT uFormate格式说明:标准剪贴簿数据格式

Windows支持不同的预先定义剪贴簿格式, 这些格式在WINUSER.H定义成以CF为前缀的标识符。

■三种能够储存在剪贴簿上的文字数据型态:

①CF_TEXT    以NULL结尾的ANSI字符集字符串。它在每行末尾包含一个carriage  return和linefeed字符,这是最简单的剪贴簿数据格式。

②CF_OEMTEXT    含有文字数据(与CF_TEXT类似)的内存块。但是它使用的是OEM字符集。

③CF_UNICODETEXT    含有Unicode文字的内存块。与CF_TEXT类似,它在每一行的末尾包含一个carriage  return和linefeed字符,以及一个NULL字符(两个0字节)以表示数据结束。CF_UNICODETEXT只支援Windows NT。

■两种附加的剪贴簿格式、但是它们不需要以NULL结尾,因为格式已经定义了数据的结尾。

①CF_SYLK    包含Microsoft 「符号连结」数据格式的整体内存块。这种格式用在Microsoft的Multiplan、Chart和Excel程序之间交换数据,它是一种ASCII码格式。

②CF_DIF    包含数据交换格式(DIF)之数据的整体内存块。用于把数据送到VisiCalc电子表格程序中。这也是一种ASCII码格式

■下面三种剪贴簿格式与位图有关。所谓位图就是数据位的矩形数组

①CF_BITMAP    与设备相关的位图格式。位图是通过位图句柄传送给剪贴簿的。

②CF_DIB    定义一个设备无关位图的内存块。

③CF_PALETTE    调色盘句柄。

■下面是两个metafile格式、metafile就是一个以二进制格式储存的画图命令集

①CF_METAFILEPICT    以旧的metafile格式存放的「图片」 。

②CF_ENHMETAFILE    增强型metafile(32位Windows支持的)句柄。

■最后介绍几个混合型的剪贴簿格式:

CF_PENDATA与Windows的笔式输入扩充功能联合使用。

CF_WAVE声音(波形)文件。

CF_RIFF使用资源交换文件格式(Resource Interchange File Format)的多媒体数据。

CF_HDROP与拖放服务相关的文件列表。

 

二:UINT uFlags格式说明:内存属性

GMEM_FIXED

  分配一块固定的内存区域,不允许系统移动,这时返回值是一个指针。

GMEM_MOVEABLE

  分配一块可移动的内存区域,实际上内存块在物理内存中是不可移动的,这里的可移动指的是在应用程序的默认逻辑堆内可以移动。返回值是内存对象的句柄。可以通过调研GlobalLock()函数将一个句柄转化为一个指针,这个标志不能喝GMEM_FIXED 同时使用

GMEM_ZEROINT   

  初始化内存对象为全0,如果不用这个标志,内存对象将为不确定的内容

GHND

  GMEM_MOVEABLE和GMEM_ZEROINT块标志联合使用,即可移动同时初始化为0

GPTR

  GMEM_FIXED和GMEM_ZEROINT标志联合使用,即不可移动同时初始化为0

 1 void  CMFC_TabCtrlDlg::SetClipBoardData_(CString strText)
 2 {
 3     /*
 4     OpenClipboard打开剪切板:指定关联到打开的剪切板的窗口句柄,传入NULL表示关联到当前任务。每次只允许一
 5     个进程打开并访问。每打开一次就要关闭,否则其他进程无法访问剪切板。
 6     EmptyClipboard清空剪切板:写入前必须先清空,得到占有权
 7     */
 8     if (::OpenClipboard(m_hWnd) &&::EmptyClipboard())
 9     {
10         //根据环境变量获取数据长度
11         size_t cbStr = (strText.GetLength() + 1) * sizeof(TCHAR);
12 
13         //在堆上动态分配以字节为单位的全局内存区域。成功则指向该内存,失败NULL。参数:1.分配内存属性,2.大小
14         HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, cbStr); 
15 
16         if (hMem == NULL) 
17         {
18             //关闭剪切板,释放剪切板所有权,关闭后就不能写入数据
19             CloseClipboard();
20             return; 
21         }
22 
23         //锁定由GlobalAlloc分配的内存,并将内存对象的锁定计数器+1;成功返回指向内存对象起始地址的指针。失败NULL
24         LPTSTR lpDest = (LPTSTR)GlobalLock(hMem);
25         /*
26         系统为每个全局内存对象维护一个锁定计数器,初始为0,GlobalLock使计数器+1,
27         */
28 
29         //拷贝数据到剪贴板内存。
30         memcpy_s(lpDest, cbStr, strText.LockBuffer(), cbStr);
31         strText.UnlockBuffer();
32 
33         //解除内存锁定,将属性为GMEM_MOVEABLE的内存对象计数器-1.
34         GlobalUnlock(hMem); 
35         /*
36         GlobalUnLock计数器-1.一旦计数器值大于0,这块内存区域将不允许被移动或删除,只
37         有当为0时,才解除对这块内存的锁定。如果分配时GMEM_FIXED属性,计数器一直为0
38 
39         */
40 
41         //根据环境变量设置数据格式
42         UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT;
43 
44         //设置数据到剪贴板。执行成功,返回数据句柄,否则返回NULL
45         if(SetClipboardData(uiFormat, hMem) == NULL); 
46         {
47             CloseClipboard();
48             return;
49         }
50 
51         CloseClipboard();
52     }
53 }

 

2.从剪切板内存获取数据

 1 void CMFC_TabCtrlDlg::GetClipBoardData_(void)
 2 {
 3     //if (IsClipboardFormatAvailable(CF_UNICODETEXT)) //判断某种格式的数据是否可用
 4     if(::OpenClipboard(m_hWnd))
 5     {
 6         UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT;
 7 
 8         ////执行成功,返回数据句柄,否则返回NULL。参数:1.数据格式,2.指定格式的数据的句柄
 9         HGLOBAL hMem = GetClipboardData(uiFormat); 
10 
11         if (hMem != NULL) 
12         { 
13             //获取UNICODE的字符串。
14             LPCTSTR lpStr = (LPCTSTR)GlobalLock(hMem); 
15             if (lpStr != NULL) 
16             { 
17                 SetDlgItemText(IDC_EDIT1, lpStr);
18             } 
19             GlobalUnlock(hMem);
20         } 
21     }
22     CloseClipboard();
23 }

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭