C++ 通过调用win api实现一下逻辑1 备份Clipboard的所有类型的数据保存到一个全局结构 直接内存copy因为Clipboard数据是共享的2 操作其他东西3 恢复Clipboard的所有数据
#include <windows.h>
struct ClipboardBackup { HANDLE hData; UINT format; DWORD dataSize; };
// 备份Clipboard数据 void BackupClipboard() { if (!OpenClipboard(NULL)) { return; }
// 遍历所有格式
UINT format = 0;
while ((format = EnumClipboardFormats(format)) != 0) {
// 获取数据句柄和大小
HANDLE hData = GetClipboardData(format);
if (hData == NULL) {
continue;
}
DWORD dataSize = GlobalSize(hData);
if (dataSize == 0) {
continue;
}
// 分配内存并拷贝数据
void* pData = GlobalAlloc(GMEM_MOVEABLE, dataSize);
if (pData == NULL) {
continue;
}
void* pSrcData = GlobalLock(hData);
if (pSrcData == NULL) {
GlobalFree(pData);
continue;
}
memcpy(pData, pSrcData, dataSize);
GlobalUnlock(hData);
// 保存到备份结构中
ClipboardBackup backup = { hData, format, dataSize };
// TODO: 将备份结构保存到全局变量中
}
CloseClipboard();
}
// 恢复Clipboard数据 void RestoreClipboard() { if (!OpenClipboard(NULL)) { return; }
// 清空Clipboard
EmptyClipboard();
// 遍历备份结构,逐个设置数据
// TODO: 从全局变量中获取备份结构
for (int i = 0; i < backupCount; i++) {
ClipboardBackup& backup = backups[i];
if (backup.hData == NULL || backup.dataSize == 0) {
continue;
}
void* pData = GlobalAlloc(GMEM_MOVEABLE, backup.dataSize);
if (pData == NULL) {
continue;
}
void* pSrcData = GlobalLock(backup.hData);
if (pSrcData == NULL) {
GlobalFree(pData);
continue;
}
memcpy(pData, pSrcData, backup.dataSize);
GlobalUnlock(backup.hData);
HANDLE hNewData = SetClipboardData(backup.format, pData);
if (hNewData == NULL) {
GlobalFree(pData);
}
}
CloseClipboard();
}
// 示例操作其他东西的函数 void DoSomething() { // TODO: 在这里执行需要操作的功能 }
int main() { // 备份Clipboard数据 BackupClipboard();
// 执行操作
DoSomething();
// 恢复Clipboard数据
RestoreClipboard();
return 0;
原文地址: https://www.cveoy.top/t/topic/g8dW 著作权归作者所有。请勿转载和采集!