在C/C++中通过编程将Windows 11控制台文本复制到剪贴板
在Windows 11控制台中用C/C++复制所有文本到剪贴板
要实现和手动全选+Ctrl+C等效的功能,最可靠的方式是直接读取控制台输出缓冲区的文本再写入剪贴板——比模拟按键的方式更稳定,不会受焦点状态影响。以下是具体实现:
核心思路
- 获取控制台输出句柄,查询缓冲区的行列尺寸
- 读取缓冲区中所有字符数据
- 利用Windows剪贴板API,将读取到的文本写入剪贴板
完整代码示例
#include <Windows.h> #include <vector> #include <string> bool CopyConsoleTextToClipboard() { // 获取控制台输出句柄 HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsoleOut == INVALID_HANDLE_VALUE) { return false; } // 获取控制台缓冲区信息 CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(hConsoleOut, &csbi)) { return false; } // 计算缓冲区总字符数 DWORD bufferSize = csbi.dwSize.X * csbi.dwSize.Y; std::vector<CHAR_INFO> buffer(bufferSize); COORD bufferCoord = {0, 0}; SMALL_RECT readRect = {0, 0, csbi.dwSize.X - 1, csbi.dwSize.Y - 1}; // 读取缓冲区文本 DWORD charsRead; if (!ReadConsoleOutput(hConsoleOut, buffer.data(), csbi.dwSize, bufferCoord, &readRect)) { return false; } // 拼接成字符串(处理换行) std::string consoleText; consoleText.reserve(bufferSize); for (DWORD i = 0; i < bufferSize; ++i) { if (i > 0 && i % csbi.dwSize.X == 0) { consoleText += '\n'; } consoleText += buffer[i].Char.AsciiChar; } // 打开剪贴板 if (!OpenClipboard(nullptr)) { return false; } EmptyClipboard(); // 分配全局内存存储文本(需包含终止符) size_t textSize = consoleText.size() + 1; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, textSize); if (hGlobal == nullptr) { CloseClipboard(); return false; } // 将文本复制到全局内存 char* pGlobal = static_cast<char*>(GlobalLock(hGlobal)); if (pGlobal != nullptr) { memcpy(pGlobal, consoleText.c_str(), textSize); GlobalUnlock(hGlobal); // 设置剪贴板数据 SetClipboardData(CF_TEXT, hGlobal); } else { GlobalFree(hGlobal); CloseClipboard(); return false; } // 清理 CloseClipboard(); return true; } int main() { if (CopyConsoleTextToClipboard()) { printf("控制台文本已复制到剪贴板\n"); } else { printf("复制失败,错误码: %lu\n", GetLastError()); } return 0; }
关键细节说明
- 控制台缓冲区读取:使用
ReadConsoleOutput直接读取底层缓冲区,能获取所有已输出的文本,包括滚动出视野的内容 - 剪贴板操作:必须按
OpenClipboard→EmptyClipboard→SetClipboardData→CloseClipboard的流程操作,全局内存需用GMEM_MOVEABLE标志,确保剪贴板能正确接管内存 - 字符处理:控制台缓冲区的
CHAR_INFO存储ASCII字符,拼接时按每行的列数插入换行符,还原原始格式
内容的提问来源于stack exchange,提问作者Bob Penoyer
相关产品推荐
相关产品推荐

