You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#或C++中获取Windows剪贴板信息(含程序启动前已设置的内容)

没问题!不管是C#还是C++,都能轻松获取剪贴板内容——哪怕是你的程序启动前就已经存在的剪贴板信息,因为剪贴板是系统级的公共区域,只要系统没清空它,就能拿到。下面分别给你两种语言的具体实现方法:

C# 实现方法

在C#里操作剪贴板很方便,但要注意必须在STA(单线程单元)线程中执行:WinForms或WPF程序默认就是STA模式,不用额外处理;但控制台程序默认是MTA,得手动切换线程模型,否则会报错。

场景1:WinForms/WPF 程序

直接用Clipboard类就能快速获取内容,比如获取文本:

// WinForms 引用 using System.Windows.Forms;
// WPF 引用 using System.Windows;

// 获取剪贴板文本
string clipboardText = Clipboard.GetText();
if (!string.IsNullOrEmpty(clipboardText))
{
    Console.WriteLine("剪贴板内容:\n" + clipboardText);
}
else
{
    Console.WriteLine("剪贴板里没有文本内容");
}

场景2:控制台程序

控制台程序需要手动创建STA线程来操作剪贴板,示例代码如下:

using System;
using System.Threading;
using System.Windows.Forms;

class Program
{
    static void Main()
    {
        // 新建一个STA线程处理剪贴板操作
        Thread staThread = new Thread(FetchClipboardContent);
        staThread.SetApartmentState(ApartmentState.STA);
        staThread.Start();
        staThread.Join();
    }

    static void FetchClipboardContent()
    {
        try
        {
            string clipboardText = Clipboard.GetText();
            Console.WriteLine("剪贴板文本内容:");
            Console.WriteLine(clipboardText ?? "无有效文本");
        }
        catch (Exception ex)
        {
            Console.WriteLine("获取剪贴板失败:" + ex.Message);
        }
    }
}
C++ 实现方法

C++可以直接调用Windows的Win32 API来访问剪贴板,这种方法不依赖任何框架,能直接读取系统剪贴板的内容(包括程序启动前就存在的信息)。

下面是获取剪贴板文本的完整示例:

#include <windows.h>
#include <iostream>
#include <string>

std::string GetClipboardText()
{
    std::string result;
    // 打开剪贴板,当前线程独占访问权,直到关闭
    if (!OpenClipboard(nullptr))
    {
        std::cerr << "无法打开剪贴板" << std::endl;
        return result;
    }

    // 获取剪贴板中的文本数据句柄
    HANDLE hClipboardData = GetClipboardData(CF_TEXT);
    if (hClipboardData == nullptr)
    {
        std::cerr << "剪贴板中没有文本数据" << std::endl;
        CloseClipboard();
        return result;
    }

    // 锁定内存,获取数据指针
    char* pszText = static_cast<char*>(GlobalLock(hClipboardData));
    if (pszText != nullptr)
    {
        result = pszText;
        GlobalUnlock(hClipboardData);
    }

    // 必须关闭剪贴板,释放资源给其他程序使用
    CloseClipboard();
    return result;
}

int main()
{
    std::string clipboardContent = GetClipboardText();
    if (!clipboardContent.empty())
    {
        std::cout << "剪贴板内容:\n" << clipboardContent << std::endl;
    }
    else
    {
        std::cout << "剪贴板为空或无法获取内容" << std::endl;
    }
    return 0;
}

注意事项

  • 调用OpenClipboard后一定要记得调用CloseClipboard,否则其他程序无法访问剪贴板
  • 如果需要获取图片等其他格式内容,可以替换CF_TEXT为对应的格式常量(比如CF_BITMAP),再做相应的解析处理

内容的提问来源于stack exchange,提问作者chup

火山引擎 最新活动