如何在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




