在剪切板中使用自定义格式的数据

来源:互联网 发布:latex windows 10 编辑:程序博客网 时间:2024/05/22 13:42
void TestManualFormatClipboard(){  //自定义数据结构体    typedef struct _MYSTRUCT  {    CHAR charVal[16];    int iVal;    long lVal;    double fVal;  }MYSTRUCT, *LPMYSTRUCT;  MYSTRUCT wrStruct = {"ABCD", 0, 1, 2.0};  MYSTRUCT rdStruct = {"DCBA", 0, 2, 4.0};  DWORD dwError = 0;  UINT uFormat = 0;  //注册自定义格式  if(dwError == 0)  {    uFormat = RegisterClipboardFormat(_T("TestManulaFormat"));    if(uFormat == 0)//注册格式失败    {      dwError = GetLastError();      TRACE(_T("RegisterClipboardFormat Error (%ld)\n"), dwError);    }  }  //将数据写入剪切板  if(dwError == 0)  {    if(OpenClipboard(NULL))//打开剪切板    {      if(EmptyClipboard())//清空剪切板      {        DWORD dwSize = sizeof(wrStruct);        HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, dwSize); //分配内存        if(hMem)//分配内存有效        {          memcpy(GlobalLock(hMem), &wrStruct, dwSize);//拷贝数据          GlobalUnlock(hMem);//解锁                    if(SetClipboardData(uFormat, hMem) == NULL) //数据写入剪切板          {            dwError = GetLastError();            TRACE(_T("SetClipboardData Error for write(%ld)\n"), dwError);                      }        }        else //分配内存出错        {          dwError = GetLastError();          TRACE(_T("GlobalAlloc Error for write(%ld)\n"), dwError);        }      }      else //清空剪切板失败      {        dwError = GetLastError();        TRACE(_T("EmptyClipboard Error for write(%ld)\n"), dwError);      }      if(!CloseClipboard())//关闭剪切板      {        dwError = GetLastError();        TRACE(_T("CloseClipboard Error for write(%ld)\n"), dwError);      }    }    else//打开剪切板失败    {      dwError = GetLastError();      TRACE(_T("OpenClipboard Error for write(%ld)\n"), dwError);    }  }  //从剪切板读出数据  if(dwError == 0)  {    if(OpenClipboard(NULL)) //打开剪切板    {      if(IsClipboardFormatAvailable(uFormat))//检查格式有效      {        HGLOBAL hMem = GetClipboardData(uFormat);//读取数据句柄        if(hMem != NULL)        {          memcpy(&rdStruct, GlobalLock(hMem), sizeof(rdStruct));//读出数据          GlobalUnlock(hMem);//解锁        }        else//读取句柄失败        {          dwError = GetLastError();          TRACE(_T("GetClipboardData Error for read (%ld)\n"), dwError);         }      }      else//格式无效      {        dwError = GetLastError();        TRACE(_T("IsClipboardFormatAvailable Error for read (%ld)\n"), dwError);              }      if(!CloseClipboard())//关闭剪切板      {        dwError = GetLastError();        TRACE(_T("CloseClipboard Error for read (%ld)\n"), dwError);      }    }    else //打开剪切板失败    {      dwError = GetLastError();      TRACE(_T("OpenClipboard Error for read (%ld)\n"), dwError);    }  }  //比较数据  if(dwError == 0)  {    if(memcmp(&wrStruct, &rdStruct, sizeof(wrStruct))==0)//相等    {    }    else    {      TRACE(_T("failed to compare data!\n"));      ASSERT(FALSE);    }  }}