在剪切板中使用自定义格式的数据
来源:互联网 发布: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); } }}