原文转自 http://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html

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

剪切板操作方法如下:(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. 将数据保存到剪切板

  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() + ) * 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. }

【Windows API】OpenClipboard --- 剪切板(转)的更多相关文章

  1. 为什么使用剪切板时都用GlobalAlloc分配内存(历史遗留问题,其实没关系了)

    我在使用剪切板时,发现通用的都是使用GlobalAlloc来分配内存,我就想不是说在Win32中GlobalAlloc和LocalAlloc是一样的那为什么不用LocalAlloc呢,原谅我的好奇心吧 ...

  2. 监视 Windows 剪切板

    一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...

  3. 【笨嘴拙舌WINDOWS】实践检验之剪切板查看器【Delphi】

    该程序能够监视Windows剪切板的内容(文字和图片) 其思路是 先调用SetClipBoardViewer(Self.Handle),让Windows剪切板内容发生改变之后,通知本程序: 然后截获W ...

  4. windows剪切板暂存

    其实最初是因为在项目中使用了html网页编辑器,通过ie的com组件和javascript通讯完成一些事情,其中有一个功能是插入表格,我们原本使用的range.pasteHTML(HTMLstr);根 ...

  5. VFP 图形文件与剪切板互换的API解决方法

    在 VFP 中,凡遇图形处理,大多数情况下,都会涉及到图形文件与剪切板互换的情况.下面给出利用 API 解决的方法.这是原来从网上摘下来的,版权归原作者.基本处理的代码如下,你可以将其应用到你的代码中 ...

  6. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))

    WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))       最近碰到一个问题,需要弄个小工具来解决.刚好接触到WPF, ...

  7. 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件

    [源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...

  8. 背水一战 Windows 10 (102) - 应用间通信: 剪切板

    [源码下载] 背水一战 Windows 10 (102) - 应用间通信: 剪切板 作者:webabcd 介绍背水一战 Windows 10 之 应用间通信 剪切板 - 基础, 复制/粘贴 text ...

  9. Windows 10 - 查看系统剪切板历史

    在之前的Windows版本(1809之前),Windows的剪切板历史一直都是对用户不可见的. 也就是它只保留最后一次的剪切记录,但是这个记录是什么,不知道!只能粘贴出来才知道. 但是现在变了,Win ...

随机推荐

  1. 01_9_Struts用ModelDriven接收参数

    01_9_Struts用ModelDriven接收参数 1. 配置struts.xml文件 <package name="user" namespace="/use ...

  2. textContent和innerText属性的区别

    原文摘自 textContent和innerText属性的区别 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  3. VC下的C语言程序随机数的产生

    本文章适用于VC编译器,VC编译器里有个rand()函数,我们用它来实现取随机数. #include <stdio.h> #include<stdlib.h> //随机数的头文 ...

  4. PostgreSQL学习(2)-- mvcc

    1.PG事务隔离级别 在数据库中,并发的操作进行读写数据时,则会遇到脏读.不可重复读.幻读.串行化异常等问题. 数据库事务的特性: 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对 ...

  5. 如何用纯 CSS 创作一颗逼真的土星

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 ...

  6. 8.Yii2.0框架控制器接收get.post数据

    8.Yii2.0框架控制器接收get.post数据 一.get传参 <?php /** * Created by Haima. * Author:Haima * QQ:228654416 * D ...

  7. loj2028 「SHOI2016」随机序列

    定义区间是内部只含有乘号的区间. 对于区间左端点是 \(l \geq 2\) 的情况,左端点前头是加号的情况和前头是减号的情况的个数是相同的.因此这些区间不对答案产生贡献. 所以区间左端点必定是 \( ...

  8. 一个JS判断客户端是否已安装某个字体(Only IE)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Jmeter Cluster

    Jmeter 是开源软件,100%纯java应用程序,专门为负载测试和性能测试. Jmeter的特性包括: 1.负载测试和性能测试许多不同的服务器/协议类型: Web - HTTP, HTTPS SO ...

  10. PHP 修改配置文件后重启命名

    centosPHP配置文件路径: /etc/php.ini 修改完配置文件后需要重启php服务: systemctl restart php-fpm