使用 C++ 和 Win API 备份和恢复剪贴板数据

本示例演示如何使用 C++ 和 Win API 备份和恢复剪贴板数据,包括所有类型的剪贴板数据。代码提供了备份和恢复剪贴板数据的函数,以及示例代码展示如何使用这些函数。

1. 备份剪贴板数据

代码首先定义一个 ClipboardBackup 结构来保存剪贴板数据信息,包括数据句柄、格式和大小。然后,BackupClipboard() 函数会遍历所有剪贴板格式,获取每个格式的数据句柄和大小,并分配内存空间进行数据拷贝。最后,将数据信息保存到全局变量中。

#include <windows.h>

struct ClipboardBackup {
    HANDLE hData;
    UINT format;
    DWORD dataSize;
};

// 备份剪贴板数据
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();
}

2. 恢复剪贴板数据

RestoreClipboard() 函数会先清空剪贴板,然后遍历备份结构,逐个设置剪贴板数据。

// 恢复剪贴板数据
void RestoreClipboard() {
    if (!OpenClipboard(NULL)) {
        return;
    }

    // 清空剪贴板
    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();
}

3. 示例代码

示例代码展示如何使用 BackupClipboard() 和 RestoreClipboard() 函数进行剪贴板操作。

// 示例操作其他东西的函数
void DoSomething() {
    // TODO: 在这里执行需要操作的功能
}

int main() {
    // 备份剪贴板数据
    BackupClipboard();

    // 执行操作
    DoSomething();

    // 恢复剪贴板数据
    RestoreClipboard();

    return 0;
}

注意:

  • 代码中使用 // TODO: 注释的部分需要根据实际情况进行完善,例如如何保存和读取备份结构。
  • 备份剪贴板数据需要考虑内存泄漏问题,在使用完数据后需要释放内存。
  • 剪贴板数据是共享的,需要谨慎操作,避免破坏其他程序对剪贴板的使用。
C++ 使用 Win API 备份和恢复剪贴板数据

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

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