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;     //返回成功
}
                    
                
                
            
        
浙公网安备 33010602011771号