You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C/C++中通过编程将Windows 11控制台文本复制到剪贴板

在Windows 11控制台中用C/C++复制所有文本到剪贴板

要实现和手动全选+Ctrl+C等效的功能,最可靠的方式是直接读取控制台输出缓冲区的文本再写入剪贴板——比模拟按键的方式更稳定,不会受焦点状态影响。以下是具体实现:

核心思路

  1. 获取控制台输出句柄,查询缓冲区的行列尺寸
  2. 读取缓冲区中所有字符数据
  3. 利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:04:51