C++ 使用 Win API 备份和恢复剪贴板数据
使用 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:注释的部分需要根据实际情况进行完善,例如如何保存和读取备份结构。 - 备份剪贴板数据需要考虑内存泄漏问题,在使用完数据后需要释放内存。
- 剪贴板数据是共享的,需要谨慎操作,避免破坏其他程序对剪贴板的使用。
原文地址: https://www.cveoy.top/t/topic/oBqv 著作权归作者所有。请勿转载和采集!