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

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

1.打开剪切板

Bool OpenClipboard(HWND hWndNewOwner);

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

void  CMFC_TabCtrlDlg::SetClipBoardData_(CString strText)
{/*OpenClipboard打开剪切板:指定关联到打开的剪切板的窗口句柄,传入NULL表示关联到当前任务。每次只允许一个进程打开并访问。每打开一次就要关闭,否则其他进程无法访问剪切板。EmptyClipboard清空剪切板:写入前必须先清空,得到占有权*/if (::OpenClipboard(m_hWnd) &&::EmptyClipboard()){//根据环境变量获取数据长度size_t cbStr = (strText.GetLength() + 1) * sizeof(TCHAR);//在堆上动态分配以字节为单位的全局内存区域。成功则指向该内存,失败NULL。参数:1.分配内存属性,2.大小HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, cbStr);if (hMem == NULL){//关闭剪切板,释放剪切板所有权,关闭后就不能写入数据CloseClipboard();return;}//锁定由GlobalAlloc分配的内存,并将内存对象的锁定计数器+1;成功返回指向内存对象起始地址的指针。失败NULLLPTSTR lpDest = (LPTSTR)GlobalLock(hMem);/*系统为每个全局内存对象维护一个锁定计数器,初始为0,GlobalLock使计数器+1,*///拷贝数据到剪贴板内存。memcpy_s(lpDest, cbStr, strText.LockBuffer(), cbStr);strText.UnlockBuffer();//解除内存锁定,将属性为GMEM_MOVEABLE的内存对象计数器-1.GlobalUnlock(hMem);/*GlobalUnLock计数器-1.一旦计数器值大于0,这块内存区域将不允许被移动或删除,只有当为0时,才解除对这块内存的锁定。如果分配时GMEM_FIXED属性,计数器一直为0*///根据环境变量设置数据格式UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT;//设置数据到剪贴板。执行成功,返回数据句柄,否则返回NULLif(SetClipboardData(uiFormat, hMem) == NULL);{CloseClipboard();return;}CloseClipboard();}
}
void CMFC_TabCtrlDlg::GetClipBoardData_(void)
{//if (IsClipboardFormatAvailable(CF_UNICODETEXT)) //判断某种格式的数据是否可用if(::OpenClipboard(m_hWnd)){UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT;执行成功,返回数据句柄,否则返回NULL。参数:1.数据格式,2.指定格式的数据的句柄HGLOBAL hMem = GetClipboardData(uiFormat);if (hMem != NULL){//获取UNICODE的字符串。LPCTSTR lpStr = (LPCTSTR)GlobalLock(hMem);if (lpStr != NULL){SetDlgItemText(IDC_EDIT1, lpStr);}GlobalUnlock(hMem);}}CloseClipboard();
}

WINDOWS API——OPENCLIPBOARD——剪切板相关推荐

  1. Windows进程间通信之剪切板

    Windows平台下进程间通信的方式:剪切板.匿名管道.命名管道.邮槽. 实际上socket网络通信就是在两个进程之间的通信,需了解相关的网络协议. 一.剪切板 剪切板是所有进程都可以访问的. 发送端 ...

  2. Windows 远程桌面剪切板失效

    环境: Windows Server 2019 Windows 10 问题描述: 从本机复制文本或图片,无法粘贴到远程主机,从远程主机无法复制文本或图片到当前本地主机,远程桌面剪切板失效 解决方案: ...

  3. 在Git for windows(MSYS2)中实现tmux和windows剪切板的共享功能

    一直以来个人开发环境中linux下tmux和系统剪切板的共享功能都是通过xclip机制实现的,废话不多说直接贴在用的tmux配置文件吧: # 显示vi-cope模式下的映射 tmux list-key ...

  4. Linux向日葵同步剪贴板,向日葵Windows客户端“剪切板”功能:打破“无形的墙”...

    经常使用远程控制的朋友,可能会遇到这样的问题:想要复制被控电脑中的一段文字到主控端,该如何操作呢?虽然要复制的内容已经"同屏出现",但是主控端被控端之间仿佛有一堵"无形的 ...

  5. windows系统中的剪切板记录如何开启和使用

    windows设置--系统--剪切板--开启剪切板历史记录 这个很好用,剪切板可以记录你最近复制剪切的图片,文字! 按win+v可以快捷使用 实际效果如下

  6. 计算机中剪切板的定义,在windows中剪切板是用来

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. windows操作系统中剪切板是用来提供暂存数据.提供共享的一个模块.剪切板也可以被称为数据中转站,剪切板在后台起作用,在内存里, ...

  7. C语言学习:除去剪切板内容的换行与回车

    前言 我们在复制PDF文件文本内容的时候,常常为文本中多了些换行符而困扰,所以作者特地制作一个程序解决这个问题. 程序说明 作者为博主:余宁C 程序自动将剪切板中的回车或者换行替换为空格,每1s执行一 ...

  8. python实现自动翻译剪切板

    复制中文粘贴英文 有时候需要把A文件翻译到B文件中,直接上传到谷歌翻译是个好办法,但是文章的排版可能会乱掉,那有什么可以直接把剪切板中的内容翻译到英文的程序呢?作为程序员,我选择自己编写>_&l ...

  9. C语言学习:剪切板UNICODE码使用

    前言 本文程序是基于作者另一篇文章的程序基础上做修改,链接:(17条消息) C语言学习:除去剪切板内容的换行与回车_余宁C的博客-CSDN博客 由于剪切板中普通的text数据是8位的,不能支持一些字符 ...

最新文章

  1. 我所知道的flex布局 —— 上篇
  2. (转)flask的context机制
  3. 各浏览器对document.getElementById等方法的实现差异
  4. 企业级 SpringBoot 教程 (十)用spring Restdocs创建API文档
  5. HashMap的四种访问方式
  6. Windows PowerShell:(2)基本操作
  7. Sublime+ZenCoding的使用
  8. 21个Docker 命令
  9. Java多线程(三)——多线程实现同步
  10. Codeforces 1174E Ehab and the Expected GCD Problem
  11. 乳腺癌检测_逻辑回归
  12. 谈谈VIP漂移那点破事
  13. [转]Windows Shell 编程 第五章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987939】...
  14. python-socket模块基本用法收集
  15. IOS fiddler抓包配置
  16. JS基础-模拟京东快递单号查询案例
  17. 远程安全接入解决方案
  18. [转]AndroidTolls国内镜像
  19. EXCEL地理工具--小O地图EXCEL插件0705版 2022.4.28发布
  20. 惠勒延迟选择实验(转)

热门文章

  1. 计算机毕业设计java+ssm广州市家教中介服务网站(源码+系统+mysql数据库+Lw文档)
  2. 数据库视图和索引基本知识
  3. Blender:Lowpoly头部建模流程 目录
  4. 最新联想bios logo图_软路由神器 联想M720Q=250元,M920Q=350元 8代mini主机大跳水?...
  5. 数字万用表原理图,重点是第三种,电路详细
  6. 解决mysql8.0登录验证失败的问题
  7. B2C购物网站常用分类目录
  8. R语言入门: %>%
  9. el-table fixed多级表头固定列问题
  10. 坪山计算机学院,深圳电脑培训、坪山办公文员Office办公速成培训