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,则分配固定内存,清零内存并直接返回指针

复制(向剪贴板内容)操作流程

一、创建一块内存块

  1. 分配一个适当大小的内存块(GlobalAlloc, GHND)
  2. 锁定它并获得所有权(GlobalLock)
  3. 将要复制的内容拷贝到该内存
  4. 释放内存的所有权(GlobalUnlock)

二、将剪切板内容设置为它
5. 打开剪贴板(OpenClipboard)
6. 清空剪贴板(EmptyCliboard)
7. 将该内存块设为剪贴板的数据(SetClipboardData)
8. 关闭剪贴板(CloseClipboard)

粘贴(读剪贴板内容)操作流程

  1. 打开剪贴板(OpenClipboard)
  2. 获取包含剪贴板内容的内存块句柄(GetClipboardData)
  3. 锁定该内存块并获得指针(GlobalLock)
  4. 读取该内存的内容
  5. 关闭剪贴板(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;     //返回成功
}
posted @ 2018-07-19 15:53  cpluspluser  阅读(3111)  评论(0编辑  收藏  举报