zoukankan      html  css  js  c++  java
  • windows剪贴板

    标准剪贴板数据格式

    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();

  • 相关阅读:
    luogu P3959 宝藏
    hdu4035 Maze
    [hdu2899]Strange fuction
    luogu4407 [JSOI2009]电子字典 字符串hash + hash表
    SPOJ6717 Two Paths 树形dp
    luogu4595 [COCI2011-2012#5] POPLOCAVANJE 后缀自动机
    后缀数组
    luoguP1659 [国际集训队]拉拉队排练 manacher算法
    luoguP4555 [国家集训队]最长双回文串 manacher算法
    CF17E Palisection 差分+manacher算法
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1976664.html
Copyright © 2011-2022 走看看