新闻详情

新闻详情

首页 / 资讯中心 / 详情

windows(剪切板测试程序)(原生api)

发布时间:2026/9/28 20:35:57来源:尧图网络
windows(剪切板测试程序)(原生api)
剪贴板测试程序// clipboard_test.cpp // 编译MSVC // cl /EHsc /utf-8 clipboard_test.cpp user32.lib // 编译MinGW // g -stdc17 -municode clipboard_test.cpp -o clipboard_test.exe -luser32 #include windows.h #include iostream #include string // UTF-8 - UTF-16 转换剪贴板 API 仍需 UTF-16 std::wstring Utf8ToWide(const std::string s) { if (s.empty()) return std::wstring(); int needed MultiByteToWideChar(CP_UTF8, 0, s.c_str(), (int)s.size(), nullptr, 0); std::wstring out(needed, 0); MultiByteToWideChar(CP_UTF8, 0, s.c_str(), (int)s.size(), out[0], needed); return out; } std::string WideToUtf8(const std::wstring s) { if (s.empty()) return std::string(); int needed WideCharToMultiByte(CP_UTF8, 0, s.c_str(), (int)s.size(), nullptr, 0, nullptr, nullptr); std::string out(needed, 0); WideCharToMultiByte(CP_UTF8, 0, s.c_str(), (int)s.size(), out[0], needed, nullptr, nullptr); return out; } // 写剪贴板输入为 UTF-8 bool SetClipboardText(const std::string text) { if (!OpenClipboard(nullptr)) { std::cout [错误] OpenClipboard 失败, err GetLastError() std::endl; return false; } std::cout [信息] OpenClipboard 成功 std::endl; if (!EmptyClipboard()) { std::cout [错误] EmptyClipboard 失败, err GetLastError() std::endl; CloseClipboard(); return false; } std::cout [信息] EmptyClipboard 成功 std::endl; // 转成 UTF-16 后再放进剪贴板 std::wstring wide Utf8ToWide(text); const size_t bytes (wide.size() 1) * sizeof(wchar_t); HGLOBAL hMem GlobalAlloc(GMEM_MOVEABLE, bytes); if (!hMem) { std::cout [错误] GlobalAlloc 失败, err GetLastError() std::endl; CloseClipboard(); return false; } void* p GlobalLock(hMem); if (!p) { std::cout [错误] GlobalLock 失败 std::endl; GlobalFree(hMem); CloseClipboard(); return false; } memcpy(p, wide.c_str(), bytes); GlobalUnlock(hMem); // 注意SetClipboardData 返回 HANDLE不是 BOOL HANDLE result SetClipboardData(CF_UNICODETEXT, hMem); if (result nullptr) { std::cout [错误] SetClipboardData 失败, err GetLastError() std::endl; GlobalFree(hMem); // 失败时自己释放 CloseClipboard(); return false; } // 成功后 hMem 所有权归系统不要再 GlobalFree std::cout [信息] SetClipboardData 成功 std::endl; CloseClipboard(); std::cout [信息] CloseClipboard 完成 std::endl; return true; } // 读剪贴板输出为 UTF-8 std::string GetClipboardText() { std::string result; if (!OpenClipboard(nullptr)) { std::cout [错误] 读: OpenClipboard 失败, err GetLastError() std::endl; return result; } if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) { std::cout [信息] 读: 没有 CF_UNICODETEXT 格式 std::endl; CloseClipboard(); return result; } HANDLE hData GetClipboardData(CF_UNICODETEXT); if (!hData) { std::cout [错误] 读: GetClipboardData 失败, err GetLastError() std::endl; CloseClipboard(); return result; } wchar_t* p static_castwchar_t*(GlobalLock(hData)); if (p) { std::wstring wide(p); result WideToUtf8(wide); GlobalUnlock(hData); } CloseClipboard(); return result; } int main() { // 控制台代码页切到 UTF-8配合 UTF-8 源文件和 std::cout SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); std::cout 剪贴板测试程序 std::endl; // 1. 写入 std::cout \n[步骤 1] 写入剪贴板... std::endl; if (!SetClipboardText(clipboard_test_2024)) { std::cout 写入失败程序结束 std::endl; std::cout 按回车退出...; std::cin.get(); return 1; } // 2. 立即回读 std::cout \n[步骤 2] 立即回读... std::endl; std::string readBack GetClipboardText(); std::cout 回读内容: [ readBack ] std::endl; // 3. 提示用户去记事本粘贴 std::cout \n[步骤 3] 现在打开记事本按 CtrlV 粘贴。 std::endl; std::cout 如果粘不出来说明系统层面拒绝了这个写入。 std::endl; std::cout 粘完后按回车退出... std::endl; std::cin.get(); // 4. 退出前再读一次看是否被别的程序改写 std::cout \n[步骤 4] 退出前再读一次... std::endl; readBack GetClipboardText(); std::cout 回读内容: [ readBack ] std::endl; std::cout \n按回车退出...; std::cin.get(); return 0; }说一下写剪切板函数和读剪切板函数都分别干了什么是什么样的逻辑链路写剪贴板函数SetClipboardText逻辑链路打开 → 清空 → 分配内存 → 锁定 → 拷贝 → 解锁 → 交给系统 → 关闭步骤API 调用作用失败处理1OpenClipboard(nullptr)取得剪贴板独占权。Windows 规定同一时刻只有一个进程能打开剪贴板返回 false函数退出2EmptyClipboard()清空原内容并释放旧内存让新数据干净进入CloseClipboard 返回 false3Utf8ToWide(text)UTF-8 → UTF-16。因为CF_UNICODETEXT只认 UTF-16—4GlobalAlloc(GMEM_MOVEABLE, bytes)申请一块可移动的全局堆内存。GMEM_MOVEABLE表示系统可以重定位这块内存剪贴板数据必须用这种类型CloseClipboard 返回 false5GlobalLock(hMem)锁定内存拿到指针。锁定期间内存不会被系统移动可以安全写入GlobalFreeCloseClipboard 返回 false6memcpy(p, wide.c_str(), bytes)把 UTF-16 字符串含结尾\0拷进全局堆—7GlobalUnlock(hMem)解锁。注意这之后p指针失效但数据已经在堆里—8SetClipboardData(CF_UNICODETEXT, hMem)关键一环把这块内存的所有权转移给系统。从此hMem不能再用GlobalFree释放失败时自己GlobalFree释放并CloseClipboard9CloseClipboard()关闭剪贴板让其他进程可以访问。注意必须先SetClipboardData再CloseClipboard否则数据进不去—读剪贴板函数GetClipboardText逻辑链路打开 → 检查格式 → 借数据 → 锁定 → 拷贝出来 → 解锁 → 关闭 → 转码步骤API 调用作用失败处理1OpenClipboard(nullptr)打开剪贴板只读访问也必须打开返回空字符串2IsClipboardFormatAvailable(CF_UNICODETEXT)检查剪贴板里有没有UTF-16 文本格式剪贴板可能只存图片、文件等CloseClipboard 返回空3GetClipboardData(CF_UNICODETEXT)借一块系统的内存句柄。注意这块内存所有权还是系统的我们只是借来读绝不能 freeCloseClipboard 返回空4GlobalLock(hData)锁定拿到指针。读到的是 UTF-16 字节流按wchar_t*解释—5std::wstring wide(p)关键一环把系统内存里的字符串拷贝到自己拥有的 wstring。从此以后不依赖系统内存—6GlobalUnlock(hData)解锁借来的句柄只是减引用不释放内存—7CloseClipboard()关闭剪贴板。关键必须在GlobalUnlock之后但尽量早地关闭缩短占用时间否则别的程序粘不出来—8WideToUtf8(wide)UTF-16 → UTF-8返回给调用方—
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

社区旧物回收捐赠一体化平台 2026/9/28 21:22:32

社区旧物回收捐赠一体化平台

摘 要 随着居民消费升级,社区闲置旧物激增,传统回收渠道分散、捐赠流程不透明,既造成资源浪费也加重环境负担。垃圾分类与双碳政策推进、社区公益帮扶需求提升,亟需数字化平台整合回收与捐赠,打通资源流转闭环&#x…

阅读更多 →
为什么你的磁盘总是不够用?MangoDisk磁盘清理工具帮你安全释放几十GB空间 2026/9/28 21:22:32

为什么你的磁盘总是不够用?MangoDisk磁盘清理工具帮你安全释放几十GB空间

为什么你的磁盘总是不够用?MangoDisk磁盘清理工具帮你安全释放几十GB空间 【免费下载链接】MangoDisk Safety-first disk cleaner and space analyzer for macOS and Windows, with duplicate cleanup, app uninstall, startup management, system optimization, an…

阅读更多 →
跨平台一致性实战:thinking-orbs-native 如何在 React Native + Skia 中复用 Web 引擎(附线程模型解析) 2026/9/28 21:22:32

跨平台一致性实战:thinking-orbs-native 如何在 React Native + Skia 中复用 Web 引擎(附线程模型解析)

跨平台一致性实战:thinking-orbs-native 如何在 React Native Skia 中复用 Web 引擎(附线程模型解析) 【免费下载链接】thinking-orbs Dotted thought-orb loading indicators for AI & agent UIs, 9 tuned types, two sizes, auto dark…

阅读更多 →
敏感数据脱敏 2026/9/28 21:22:32

敏感数据脱敏

顺手再加个敏感数据脱敏 上一篇做完了字典翻译,这套 SPI 还剩一个很划算的用途:敏感数据脱敏。引擎是共用的,这篇只需要写 5 个文件。没看过上一篇的话,先把那四个 json 包的文件(JsonValueEnhancer、JsonFieldProcess…

阅读更多 →
学校用知网或维普检测,论文AI率高该选哪个工具?10款降AI软件对比! 2026/9/28 21:22:32

学校用知网或维普检测,论文AI率高该选哪个工具?10款降AI软件对比!

学校用知网或维普检测,论文AI率高该选哪个工具?10款降AI软件对比! 知网AIGC检测系统又更新了,AI率变高,网上的各种免费降AI率提示词试了一个又一个,AIGC疑似度还是没变化? 学校要求AI率低于20…

阅读更多 →
ng-zorro-antd Rate 组件只读模式(nzDisabled)使用与实现详解 2026/9/28 21:22:26

ng-zorro-antd Rate 组件只读模式(nzDisabled)使用与实现详解

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读:本文围绕 ng-zorro-antd 的 Rate(评分)组件…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉