windows剪贴板

摘要:
全局解锁;在内存块访问结束后调用,这允许Windows在虚拟内存中移动内存块。EnumClipboardFormats通过打开剪贴板,可以调用此函数来确定剪贴板上存储的所有格式。方法hwndClipOwner=GetClipboardOwner()获取剪贴板所属的实例;获取窗口句柄的窗口类名方法:GetClassName;使用私有数据格式的方法:SetClipboardData;CF_ OWNERDISPLAY格式负责在剪贴板查看器的客户端区域绘制。NULL表示必须处理Windows发送给剪贴板所有者的延迟生成消息。WM_ SIZECLIPBOARD通知所有者剪贴板查看器客户端区域的大小已更改。WParam是剪贴板查看器的句柄,lParam的低字是滚动请求。

标准剪贴板数据格式

CF_TEXT

CF_OEMTEXT

CF_UNICODETEXT

CF_LOCALE

CF_SYLK:包含“符号链接”数据格式的全局内存块

CF_DIF:包含数据交换格式(DIF)的数据的全局内存块

CF_BITMAP 与设备有关的位图格式

CF_DIB 设备无关的位图的内存块,这种内存块是以位图信息结构开始的,后跟可用的颜色表和位图数据位

CF_PALETTE 调色板句柄,它通常与CF_DIB配合使用,以定义与设备有关的位图所使用的颜色调色板

CF_TIFF 包含有标记图像文件格式(TIFF)数据的全局内存块

CF_METAFILEPICT 老的元文件的“元文件图片”

CF_ENHMETAFILE 增强型元文件的句柄

CF_PENDATA 与windows的画笔扩展联合使用

CF_WAVE 声音(波形)文件

CF_RIFF 使用资源交换文件格式的多媒体数据

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

 

程序向剪贴板传输数据的时候,必须分配一个内存块,并且剪贴板将在根本上拥有它。

 

HGLOBAL 称为内存块句柄 或 全局句柄

hGlobal = GlobalAlloc(uiFlags, dwSize); 获取多进程共享数据内存的Api接口

hGlobal = GlobalReAlloc(hGlobal, dwSize, uiFlags); 内存再分配函数

dwSize = GlobalSize(hGlobal);获取内存块大小的函数

GlobalFree(hGlobal); 释放内存块的函数

p = (int *) GlobalLock(hGlobal); 获取内存块指针,在块锁定期间,windows将固定虚拟内存中的地址,不再移动。

GlobalUnlock(hGlobal); 内存块访问结束后调用,这使得windows可以在虚拟内存中移动内存块。

hGlobal = GlobalHandle(p); 通过指针获得句柄

 

为剪贴板分配内存时,应该使用带有GMEM_MOVEABLE和GMEM_SHARE标志的GlobalAlloc函数。GMEM_SHARE标志使其他应用程序可以使用内存块。

EnumClipboardFormats 通过打开剪贴板,调用此函数可以确定剪贴板存储的所有格式。

获取当前在剪贴板中的不同格式的个数:

iCount = CountClipboardFormats();

 

剪贴板延迟生成功能

为了避免剪贴板中存入的数据占用内存较大,可以使用此技术

存入方式:

OpenClipboard(hwnd);

EmptyClipboard();

SetClipboardData(iFormat, NULL); 设置数据句柄为NULL

CloseClipboard();

处理延迟的过程程序需要处理以下代码:(3个事件)

case WM_RENDERALLFORMATS: 此程序仍是剪贴板所有者时,如果要终止程序,且剪贴板含有SetClipboardData设置的NULL数据句柄,则发送此消息

OpenClipboard(hwnd);

EmptyClipboard();

case WM_RENDERFORMAT: 当另一个程序调用GetClipboardData时,windows会发送此消息,wParam的值是所要求的格式

  [put text info global memory block]

  SetClipboardData(CF_TEXT, hGlobal);

  if(message == WM_RENDERALLFORMATS)

    CloseClipboard();

  return 0;

WM_DESTROYCLIPBOARD消息是另一个程序调用EmptyClipboard时,windows给此函数发送的一个消息,告诉程序不需要构造剪贴板数据的信息,此程序不再是剪贴板的所有者了。

获取剪贴板所属的实例的方法

hwndClipOwner = GetClipboardOwner();

获得窗口句柄的窗口类名称方法:

GetClassName(hwndClipOwner, szClassName, 32);

使用私有数据格式的方法:

SetClipboardData(CF_OWNERDISPLAY, NULL); CF_OWNERDISPLAY格式承担了在剪贴板查看器的客户区域中绘图的责任,NULL表示必须处理由windows发往剪贴板所有者的延迟生成消息。此函数除了发送3个延迟消息外,还发送5个由剪贴板查看器发送到剪贴板所有者的消息。

WM_ASKCBFORMATNAME 获得数据格式名称,lParam是指向缓冲区的指针,wParam是该缓冲区能容纳的最大字符数目。

WM_SIZECLIPBOARD 通知所有者,剪贴板查看器的客户区域大小已发生变化。wParam是剪贴板查看器的句柄,lParam是指向包含新尺寸的RECT结构的指针。

WM_PAINTCLIPBOARD 通知所有者修改剪贴板查看器的客户区。wParam是剪贴板查看器的句柄,lParam是指向PAINTSTRUCT结构的全局指针。

WM_HSCROLLCLIPBOARD和WM_VSCROLLCLIPBOARD 通知剪贴板所有者,用户已经滚动了剪贴板查看器的滚动条。wParam是剪贴板查看器的句柄,lParam的低位字是滚动请求。

注册一个新的剪贴板格式的方法:

iFormat = RegisterClipboardFormat(szFormatName); iFormat 的值介于0Xc000和0xFFFF之间。

获取相应数据格式的ASCII名的方法:

GetClipboardFormatName(iFormat, psBuffer, iMaxCount);

SetClipboardViewer 函数调用可以成为剪贴板查看器链的一部分,其返回值是下一个剪贴板查看器句柄

ChangeClipboardChain 接收脱离查看器链的程序的窗口句柄和下一个剪贴板查看器的窗口句柄,当程序调用此函数时,windows将WM_CHANGECBCHAIN消息发送给当前剪贴板查看器。wParam是从链中删除它自己的那个查看器的窗口句柄,lParam是从链中删除自己后的下一个剪贴板查看器的窗口句柄。

ChangeClipboardChain(hwnd1, hwnd2); 函数的调用会使windows调用下面的事件,其中wParam = hwnd1, lParam = hwnd2     wParam是要删除的剪贴板查看器局柄,而lParam是要删除句柄的剪贴板查看器所连接的下一个句柄

case WM_CHANGECBCHAIN: 处理方法如下

      if((HWND)wParam == hwndNextViewer)

//hwndNextViewer是下一个剪贴板查看器句柄,是程序中保存的静态变量

        hwndNextViewer = (HWND)lParam;

  else if(hwndNextViewer)

        SendMessage(hwndNextViewer, message, wParam, lParam);

      return 0

获得剪贴板查看器窗口句柄的函数:

hwndViewer = GetClipboardViewer();

 

WM_DRAWCLIPBOARD 剪贴板中的内容变化时windows把此消息发送给剪贴板查看器。

 

 

 

实例:

将文本传送到剪贴板:

hGlobal = GlobalAlloc(GHND|GMEM_SHARE, iLength+1); 分配不成功返回NULL。

pGlobal = GlobalLock(hGlobal); 获得内存块指针

for(i=0; i<wLength; i++) 将字符串拷贝到内存块中

    *pGlobal++ = *pString++; GHND标志已将整个内存块在分配时清零

GlobalUnlock(hGlobal);

OpenClipboard(hwnd); 打开剪贴板

EmptyClipboard(); 清空剪贴板

SetClipboardData(CF_TEXT, hGlobal); 把内存句柄交给剪贴板

CloseClipboard(); 关闭剪贴板

注意,不要把锁定的内存句柄交给剪贴板;当调用SetClipboardData后,不能再继续使用该内存块,它不再属于用户程序,必须把句柄看成是无效的。可以制作数据的副本使用。

 

从剪贴板上获取文本:

hAvailable = IsClipboardFormatAvailable(CF_TEXT); 确定剪贴板是否含有CF_TEXT格式的数据

OpenClipboard(hwnd); 打开剪贴板

hGlobal = GetClipboardData(CF_TEXT); 获得引用文本的内存块句柄。从此函数获得的句柄不属于用户程序,它属于剪贴板,仅在GetClipboardData和CloseClipboard调用之间这个句柄才有效,不能释放这个句柄或更改它所引用的数据。

pText = (char *) malloc(GlobalSize(hGlobal)); 分配一块与剪贴板数据块大小相同的内存块,并分配一个指向该块的指针。

pGlobal = GlobalLock(hGlobal); 获取一个指向剪贴板块的指针

strcpy(pText, pGlobal); 复制数据

GlobalUnlock(hGlobal);

CloseClipboard();

注意,在任何时候,只有一个程序可以打开剪贴板。

 

获取剪贴板上存储的所有格式

iFormat = 0;

OpenClipboard(hwnd);

while(iFormat = EnumClipboardFormats(iFormat)) 每种格式返回一个正的iFormat值

{

    一些处理

}

CloseClipboard();

免责声明:文章转载自《windows剪贴板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用webpack搭建vue开发环境mui框架(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows 的鼠标事件(Event)

OnClick 当单击元素上的鼠标左按钮时(弹起后) OnDblClick 当鼠标双击元素时发生 OnMouseDown 用任何一个鼠标按钮单击对象时(弹起前) OnMouseUp 当鼠标按下任何按键再释放后发生 OnMouseOver 将鼠标指针移入对象时(指向)发生 onmousemove 当在元素上移动鼠标时发生 OnMouseOut 当鼠标离开元素...

PB各对象常用事件

1.window中的事件    事件名                  触发的时机 01.Activate            在窗口激活之前触发 02.Clicked             当用户用鼠标单击窗口的空白区域(没有控件的区域)时触发 03.Close               当关闭窗口时触发 04.CloseQuery       ...

delphi之多线程编程(一)

本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个:...

Java之nio MappedByteBuffer的资源释放问题

使用nio的MappedByteBuffer映射内存, 在最后执行File.delete()方法的时候, 返回false,  即文件没有被删除. 原因是MappedByteBuffer在内存中也会创建文件的一个句柄, 所以必须先释放MapppedByteBuffer之后才能执行文件的删除操作.如果使用SUN的JDK, 可以使用: public static...

Win32汇编操作注册表

1.打开和关闭子键 注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值: HKEY_C...

SetupDi系列函数

SetupDiClassGuidsFromName WINSETUPAPI BOOL SetupDiClassGuidsFromNameA( PCSTR ClassName, LPGUID ClassGuidList, DWORD ClassGuidListSize, PDWORD RequiredSize ); SetupDiClassGuidsF...