#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;
C++ 通过调用win api实现一下逻辑1 备份Clipboard的所有类型的数据保存到一个全局结构 直接内存copy因为Clipboard数据是共享的2 操作其他东西3 恢复Clipboard的所有数据

原文地址: https://www.cveoy.top/t/topic/g8dW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录