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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值