Windows剪切板操作
调用WinAPI实现剪切板操作的函数:
BOOL OpenClipboard(HWND hWndNewOwner); //打开剪切板
BOOL EmptyClipboard(VOID); //清空剪切板
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem); //设置剪切板内容
HANDLE GetClipboardData(UINT uFormat); //返回剪切板内容的内存块句柄
BOOL CloseClipboard(); //关闭剪切板
常用的剪切板数据类型(还包括很多其它类型,详情可参考MSDN)
CF_TEXT //一段ANSI文本
CF_OEMTEXT //一段DOS文本
CF_UNICODETEXT //一段Unicode文本
CF_LOCALE //区域标识
CF_BITMAP //位图
CF_DIB //设备无关位图
需要使用Win32内存块与剪贴板交互,常用Win32内存块操作函数(另有LocalAlloc等,功能完全相同):
HGLOBAL GlobalAlloc(分配选项, 分配内存大小); //分配全局内存并返回它的句柄或指针
HGLOBAL GlobalFree(内存块句柄); //释放全局内存
SIZE_T GlobalSize(内存块句柄); //返回全局内存的大小
LPVOID GlobalLock(内存块句柄); //获得全局内存所有权,并返回指向全局内存的指针
BOOL GlobalUnlock(内存块句柄); //释放全局内存所有权,GlobalAlloc分配选项如果是GHND,则分配可变内存,清零内存并返回全局内存句柄,需要GlobalLock以获取指针
//GlocalAlloc分配选项如果是GPTR,则分配固定内存,清零内存并直接返回指针
复制(向剪贴板内容)操作流程:
一、创建一块内存块
- 分配一个适当大小的内存块(GlobalAlloc, GHND)
- 锁定它并获得所有权(GlobalLock)
- 将要复制的内容拷贝到该内存
- 释放内存的所有权(GlobalUnlock)
二、将剪切板内容设置为它
5. 打开剪贴板(OpenClipboard)
6. 清空剪贴板(EmptyCliboard)
7. 将该内存块设为剪贴板的数据(SetClipboardData)
8. 关闭剪贴板(CloseClipboard)
粘贴(读剪贴板内容)操作流程:
- 打开剪贴板(OpenClipboard)
- 获取包含剪贴板内容的内存块句柄(GetClipboardData)
- 锁定该内存块并获得指针(GlobalLock)
- 读取该内存的内容
- 关闭剪贴板(CloseClipboard)
实例代码:
bool CopyTextToClipboard(const char *text)
{
int i = 0, j = 0;
for (; i < 6; i++)
{
//打开剪切板
j = OpenClipboard(NULL);
//判断是否打开成功,如果打开失败则重新尝试5次
if (j == 0 && i < 5)
Sleep(60);
if (j == 0 && i == 5)
return false;
if (j != 0)
{
i = 0;
j = 0;
break;
}
}
//分配字节数,HGLOBAL表示一个内存块
HGLOBAL hmem = GlobalAlloc(GHND, strlen(text) + 1);
//锁定内存中指定的内存块,并返回一个地址值令其指向内存块的起始处
char *pmem = (char *)GlobalLock(hmem);
//清空剪切板并释放剪切板内数据的句柄
EmptyClipboard();
memcpy(pmem, text, strlen(text) + 1);
SetClipboardData(CF_TEXT, hmem); //写入数据
CloseClipboard(); //关闭剪切板
GlobalFree(hmem); //释放内存块
return true; //返回成功
}