剪贴板

剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该块内存区域中取出数据,然后显示在窗口上;因为剪贴板是所有进程都可以访问的,如果某程序已经打开了剪贴板,则其他程序将不能修改剪贴板,直到前者调用了CloseClipboard函数,并且只有调用了EmptyClipboard函数清空剪贴板释放剪贴板上数据的句柄,打开剪贴板的当前窗口才拥有剪贴板;

1、打开剪贴板

  BOOL OpenClipboard();

  返回值:打开剪贴板成功返回非0值,如果其他程序或当前窗口已打开了剪贴板则返回0;

2、关闭剪贴板

  BOOL CloseClipboard();

  返回值:关闭成功返回非0值,关闭失败返回0;

3、清空剪贴板,释放剪贴板中数据的句柄

  BOOL EmptyClipboard();

  返回值:函数操作成功返回非0值,失败返回0;

4、以指定的剪贴板格式向剪贴板上放置数据

  调用SetClipboardData函数的窗口必须是剪贴板的拥有者,在这之前,该程序必须已经调用了OpenClipboard函数打开了剪贴板;

    HANDLE SetClipboardData(

      UINT uFormat,

      HANDLE hMem

    );

        uFormat:指定剪贴板格式,格式可以是已注册的格式或任一种标准的剪贴板格式;CF_TEXT为标准的剪贴板文本格式,该格式下每行数据以回车换行符终止,并以空字符作为数据的结尾;

        hMem:具有指定格式的数据的句柄;可以设为NULL采用延迟提交技术,在剪贴板上以指定的格式放置一个空剪贴板数据块,直到有其他进程需要数据或者自身进程需要终止运行时,操作系统会向数据提供进程发送WM_RENDERFORMAT和WM_RENDERALLFORMAT消息,而数据提供进程在响应消息的函数中再次调用SetClipboardData函数,这时才真正提交数据到剪贴板上;再次调用SetClipboardData函数时,就不需要调用OpenClipboard函数和EmptyClipboard函数了;

5、调用GlobalAlloc函数从堆上分配指定数目的字节作为剪贴板数据的内存对象

  HGLOBAL GlobalAlloc(

    UINT uFlags,

    DWORD dwBytes

  );

      uFlags:用来指定分配内存的方式,可取值如下;如果为0,对应为默认的GMEM_FIXED;

        GHND  --GMEM_MOVEABLE和GMEM_ZEROINIT的组合

        GMEM_FIXED  --分配一块固定内存,返回值是一个指针,该内存对象其锁计数总是0

        GMEM_MOVEABLE  --分配一块可移动的内存,返回值是一块内存对象句柄,可以用GlobalLock函数将这个句柄转换为一个指针;创建一个进程时,系统为程序分配一块默认堆,内存块在物理内存中不能被移动,但可以在一个默认堆中被移动

        GMEM_ZEROINIT  --初始化内存的内容为0

        GPTR  --GMEM_FIXED和GMEM_ZEROINIT的组合

      dwBytes:指定分配的字节数;

  LPVOID GlobalLock( HGLOBAL hMem );

    该函数将一个全局内存对象句柄转换为一个指针;每个内存对象的内部数据结构中都包含了一个初始值为0的锁计数,对于可移动的内存对象来说,GlobalLock函数将其锁计数加1,而GlobalUnlock函数将该锁计数减1;被锁定的内存对象的内存块将保持锁定,不能被移动或被废弃,直到它的锁计数为0或调用GlobalRealloc函数重新分配该内存对象,该内存块才能被移动或被废弃;

  BOOL GlobalUnlock( HGLOBAL hMem );

  对于一个进程来说,每调用一次GlobalLock函数后,一定要调用对应次数的GlobalUnlock函数;

6、从剪贴板中获得指定格式的数据

  HANDLE GetClipboardData( UINT uFormat );

  返回值:返回一个指定格式存在的剪贴板对象的句柄;

7、查看剪贴板中是否有所需的特定格式的数据

  BOOL IsClipboardFormatAvailable( UINT format );

  返回值:如果剪贴板上有所需的数据格式可用,则返回非0值,否则返回0;

时间: 2024-08-28 02:57:39

剪贴板的相关文章

深入理解DOM事件类型系列第四篇——剪贴板事件

× 目录 [1]定义 [2]对象方法 [3]应用 前面的话 剪贴板操作可能看起来不起眼,但是却十分有用,可以增强用户体验,方便用户操作.本文将详细介绍剪贴板事件 定义 剪贴板操作包括剪切(cut).复制(copy)和粘贴(paste)这三个操作,快捷键分别是ctrl+x.ctrl+c.ctrl+v.当然也可以使用鼠标右键菜单进行操作 关于这3个操作共对应下列6个剪贴板事件 copy:在发生复制操作时触发 cut:在发生剪切操作时触发 paste:在发生粘贴操作时触发 IE浏览器只有在文本中选定字

Qt Clipboard剪贴板简单使用

设置剪贴板的内容 QClipboard *clipboard = QApplication::clipboard(); clipboard->setText("contents"); 获取剪贴板的内容 QClipboard *clipboard = QApplication::clipboard(); lineEdit->setText(clipboard->text()); 需要注意的是,Qt5记得包含#include <QClipboard>

【Windows编程】系列第九篇:剪贴板使用

 上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个应用程序传递到另一个应用程序,是一种简单的进程间通信. 许多文档处理软件都有复制.剪切.粘贴功能,这些都是用Windows剪贴板实现的,当然我们也可以在我们的程序中实现自己的剪贴板功能,本篇我们就来实现自己的剪贴板.使用剪贴板时,都是先把源数据先传到剪贴板上,再在需要的时候从剪贴板传输到目的处

【vim小小记】vim的复制粘贴(包括系统剪贴板)

1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只是方向不同,比如: w 跳转到下个word,W:跳转到上个word f 某行正向查找并跳转 F: 反向.... 然后部分双写的字母有行操作: yy 复制一行 dd 删除一行 所以, p就是在当前光标后粘贴,P就是在当前光标前粘贴 另外,说完p,其实还有几个命令有时也是很有用的 gp,和p的功能基本一

js 操作剪贴板

CreateTime--2017年9月19日11:36:50 Author:Marydon 1.设置剪贴板内容 // 设置剪贴板内容 window.clipboardData.setData("Text","test"); 2.获取剪贴板内容 // 获取剪贴板内容 window.clipboardData.getData("Text"); 3.复制选择的内容到剪切板 // 复制选择的内容到剪切板 document.execCommand(&quo

Vim复制文件全部内容到系统剪贴板

参考:http://vim.wikia.com/wiki/%22copy_all_to_clipboard%22_howto vim中有两个buffer为系统的剪贴板,它们为: * (primary selection) 和 + (clipboard),其中 + 就是我们平常可以用Ctrl-C 和 Ctrl-V 的缓冲区,而要取出 * 缓冲区的内容,点击鼠标中间划轮即可. 查看缓冲区内容可以用命令 :reg ,上面两个buffer显示为 "* 和 "+ 1.Normal Mode gg

由chrome剪贴板问题研究到了js模拟鼠标键盘事件

写在前面 最近公司在搞浏览器兼容的事情,所有浏览器兼容的问题不得不一个人包了.下面来说一下今天遇到的一个问题吧 大家都知道IE下面如果要获得剪贴板里面的信息的话,代码应该如下所示 window.clipboardData.getData("Text") 可是在chrome下面就行不通了,chrome下面没有类似ie的这种方法,那应该怎么办呢,百度了一下,发现还真有办法. 只要在HTML界面上放上一个text类型的控件,如下所示 <textarea id="textAre

关于在WP8.1中使用剪贴板的问题

熟悉WindowsPhone8.0和WindowsPhone8.1开发的朋友都应该很清楚,在windowphone8.0的 开发时代下,我们可以很轻松的使用系统提供的API进行简单的文本拷贝和复制.但是,到了WindowsPhone8.1时代,情况却大不相同,微软竟然把这个API接口给阉割了,这令很多开发者所发指,说实话,我也是很无语的,还好在即将到来的Windows10中,微软又为开发者加上了这个API接口方便开发者进行使用.在本文中,笔者主要讲述在WindowsPhone8.1下该如何解决无

linux与windows共享剪贴板(clipboard)

linux与windows共享剪贴板(clipboard)的方法 先说两句废话,其实linux和windows之间不需要共享剪贴板,直接在putty中,按住SHIFT+鼠标选择就可以了. 但是作为一种hack行为或者不用鼠标实现复制功能,就需要这种方法了. 组合: putty+tmux+vim+mobaiterm/xserver 如果熟悉的朋友应该早已经用习惯了前面三个软件,号称三剑客. 后面的两个软件只是使用其中的一部分功能,即x window的剪贴板. xserver是指windows这边的

c#发送数据到剪贴板及从剪贴板获取数据

我以winform为例,设计两个textbox控件,分别命名为:textbox1和textbox2,设计两个button控件,分别命名:为btn_send和btn_get. 代码如下: <span style="font-family:Microsoft YaHei;font-size:14px;"> private void btn_send_Click(object sender, EventArgs e) { try { Clipboard.SetText(textB