新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/11/14 10:58:02来源:尧图网络
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/11/14 3:51:47

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/13 13:31:48

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/13 16:11:45

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/14 3:51:43

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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