【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容

Windows编程的剪贴板机制 Windows编程的剪贴板机制   天极网2004-9-21 9:51:00 文/郎锐  摘要: 本文对Windows剪贴板机制作了深入、全面的阐述,具体内容包括:文本、位图、DSP、自定义格式剪贴板的使用和多数据项和延迟提交技术。  关键词: VC++6.0; 剪贴板机制;数据格式;延迟提交  Windows剪贴板  Windows剪贴板是一种 阅读详情

剪贴板系列目前有四篇,包括访问剪贴板上的文本数据,查看复制文件时剪贴板上的文件数据,枚举剪贴板上数据格式以及监视剪贴板。

目录如下:

1.《【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容》

http://blog.youkuaiyun.com/morewindows/article/details/17655053

2.《【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息》

http://blog.youkuaiyun.com/morewindows/article/details/17655057

3.《【MoreWindows工作笔记11】EnumClipboardFormats剪切板内容的数据格式》

http://blog.youkuaiyun.com/morewindows/article/details/17655299

4.《【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板》

http://blog.youkuaiyun.com/morewindows/article/details/17655429

 

剪贴板的参考文档推荐http://msdn.microsoft.com/en-us/library/windows/desktop/ms649016(v=vs.85).aspx

这里很详细,也提供了丰富的示范代码,呵呵,现在微软的MSDN已经比之前改进不少了。不但实例更加丰富了,还能在下面给出评论了。


为了提高大家学习的兴趣,先看看程序运行的效果吧,先复制一些文本,然后运行程序,程序将输出剪贴板上的文本大小和文本内容。运行结果如下所示:

 

下面在来看下如何实现这个功能,先看看完整的源代码,然后在来讲解重点函数。

《【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容》的完整源代码如下所示:

// 【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容
// http://blog.youkuaiyun.com/morewindows/article/details/17655053
// By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )
#include <Windows.h>
#include <ObjBase.h>
#include <iostream>
using namespace std;

void DisplayDataObject(IDataObject *pDataObject)
{
  FORMATETC fmtetc = {CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
  STGMEDIUM stgmedium;
  if (pDataObject->GetData(&fmtetc, &stgmedium) == S_OK)
  {
    cout<<"  剪切板数据格式上为CF_TEXT, 文本内容如下:"<<endl;
    char* data = (char*)GlobalLock(stgmedium.hGlobal);
    cout<<data<<endl;
    GlobalUnlock(stgmedium.hGlobal);
    ReleaseStgMedium(&stgmedium);
  } else {
    cout<<"  剪切板数据格式不为CF_TEXT"<<endl;
  }
} 

int main()   
{
  printf("   【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容\n");
  printf(" - http://blog.youkuaiyun.com/morewindows/article/details/17655053 -\n");
  printf(" -- By MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");

  if (OleInitialize(NULL) != S_OK) return 0;
  IDataObject *pDataObject;
  // Retrieves a data object that you can use to access the contents of the clipboard.
  if (OleGetClipboard(&pDataObject) == S_OK) {
    DisplayDataObject(pDataObject);
    pDataObject->Release();
  }
  OleUninitialize();
  return 0;
}

访问剪贴板内容可以分为三步:


第一步 初始化

OleInitialize、OleUninitialize这两个函数简单,就是初始化和反初始化OLE(Object Linking and Embedding),OLE是个复杂的大东西,有兴趣可以参考参考http://msdn.microsoft.com/en-us/library/df267wkc.aspx


第二步 获取剪贴板内容

通过OleGetClipboard()函数取的剪贴板内容。其函数原型如下:

HRESULT OleGetClipboard(
  _Out_  LPDATAOBJECT *ppDataObj
);


第三步 剪贴板内容解析

主要是通过2个结构体——FORMATETC和STGMEDIUM。下面先看看FORMATETC,FORMATETC 是OLE数据交换的一个关键结构,对某种设备,数据,和相关媒体做了格式上的描述。其定义为:

typedef struct tagFORMATETC 
{ 
CLIPFORMAT cfFormat; // 剪贴板数据格式
DVTARGETDEVICE *ptd; // 设备有关的信息
DWORD dwAspect; // 图形数据的表现方式
LONG lindex; // dwAspect 成员的补充
DWORD tymed; // 数据的存储介质
} FORMATETC; 
一个典型的 FORMATETC 结构变量定义如下:
FORMATETC cFmt = {(CLIPFORMAT) CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

剪贴板数据格式在winuser.h中定义,取值如下:

// winuser.h
#ifndef NOCLIPBOARD

/*
 * Predefined Clipboard Formats
 */
#define CF_TEXT             1
#define CF_BITMAP           2
#define CF_METAFILEPICT     3
#define CF_SYLK             4
#define CF_DIF              5
#define CF_TIFF             6
#define CF_OEMTEXT          7
#define CF_DIB              8
#define CF_PALETTE          9
#define CF_PENDATA          10
#define CF_RIFF             11
#define CF_WAVE             12
#define CF_UNICODETEXT      13
#define CF_ENHMETAFILE      14
#if(WINVER >= 0x0400)
#define CF_HDROP            15
#define CF_LOCALE           16
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define CF_DIBV5            17
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0500)
#define CF_MAX              18
#elif(WINVER >= 0x0400)
#define CF_MAX              17
#else
#define CF_MAX              15
#endif
#define CF_OWNERDISPLAY     0x0080
#define CF_DSPTEXT          0x0081
#define CF_DSPBITMAP        0x0082
#define CF_DSPMETAFILEPICT  0x0083
#define CF_DSPENHMETAFILE   0x008E
/*
 * "Private" formats don't get GlobalFree()'d
 */
#define CF_PRIVATEFIRST     0x0200
#define CF_PRIVATELAST      0x02FF
/*
 * "GDIOBJ" formats do get DeleteObject()'d
 */
#define CF_GDIOBJFIRST      0x0300
#define CF_GDIOBJLAST       0x03FF

#endif /* !NOCLIPBOARD */

看完了 FORMATETC 结构体,再来看看 STGMEDIUM 结构体:
typedef struct tagSTGMEDIUM {
  DWORD    tymed;
  union {
    HBITMAP       hBitmap;
    HMETAFILEPICT hMetaFilePict;
    HENHMETAFILE  hEnhMetaFile;
    HGLOBAL       hGlobal;
    LPOLESTR      lpszFileName;
    IStream       *pstm;
    IStorage      *pstg;
  };
  IUnknown *pUnkForRelease;
} STGMEDIUM, *LPSTGMEDIUM;

这里很巧妙的使用了union来存储不同类型的句柄指针。


使用IDataObject类的GetData()函数可以根据FORMATETC的值取出相应的STGMEDIUM数据,注意最后要调用ReleaseStgMedium()来释放STGMEDIUM数据


下一篇《【MoreWindows工作笔记10】OleGetClipboard访问剪切板上的文件信息

》(http://blog.youkuaiyun.com/morewindows/article/details/17655057)将介绍在复制粘贴文件时,剪贴板会存储什么格式的数据,如何使用这些数据,欢迎继续浏览。





本文地址:http://blog.youkuaiyun.com/morewindows/article/details/17655053  转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows 





C#实现Drag and Drop操作例子 C#实现和windows资源管理器之间相互拖拽文件,并显示文件图标的列子。可以访问blog:http://blog.youkuaiyun.com/cc_net查看有关Drag和Drop的文章 立即下载

相关推荐

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 826

【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息

【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息 当我们复制文件时,会将文件的信息存储在剪贴板中,这个文件信息并不是文件路径的字符串。而是HDROP类型,本文将示范如何访问这些信息。

MoreWindows Blog 1万+

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2856

OLE剪贴板学习心得

 MFC对OLE剪贴板的支持主要集中在两个类上,分别是COleDataSource,COleDataObject。其中,COleDataSource作为操作者,而COleDataObject作为消费者,换句话说,用户需要使用COleDataSource把数据放到OLE剪贴板上,而使用COleDataObject把它取回。将保存在全局内存中的项目放置在OLE剪贴板上,需要进行如下步骤:1.在

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 3483

一文读懂世界模型(World Model):AI的“数字大脑”,通往AGI的核心基石

世界模型正成为AI领域的关键技术,它让AI在虚拟环境中模拟物理世界规律并预测行动后果,从而减少现实试错成本。2018年Ha和Schmidhuber提出的VAE+RNN架构奠定基础,2022年后自监督学习推动快速发展。当前世界模型分为潜空间、生成式、强化学习和对象中心四大流派,已在机器人、自动驾驶、工业仿真等领域落地应用。尽管面临长时序预测误差等挑战,未来将向多模态建模、大模型融合等方向发展,成为实现具身智能和通用人工智能的核心基石。

m0_38116472的博客 805

Overleaf-Latex-Elsevier-图、表、参考文献标题及引用、伪代码写法(绝对详细直观且易懂)

overleaf爱思唯尔模板踩过的一些坑以及解决办法

2403_87584552的博客 5851

OLE剪切板学习

FORMATETC 是OLE数据交换的一个关键结构,对某种设备,数据,和相关媒体做了格式上的描述。   其定义为   typedef struct tagFORMATETC   {   CLIPFORMAT cfFormat; // 剪贴板数据格式   DVTARGET...

choulixiu1105的博客 469

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 641

【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式

【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式

ffygvf的博客 208

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1471

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 239

远程工具之复制粘贴文件(基于OLE剪贴板调用资源管理器实现)

前言 最近公司基于底层云游戏串流方案衍生出一个远程产品,既然是远程产品,定然少不了双向传文件的功能,在windows操作系统上,相比于对话框这种形式的chuan

zm1_1zm 2018

linux mmap系统调用

brk/mmap linux 提供了两个比较重要的系统调用brk 和mmap,用于向内核申请相应用户空间,内核会根据系统运行状态判定是否申请新的VMA来管理新申请的用户空间,brk和mmap在整个系统中都占有非常重要的地位。 brk()系统调用被gblic进行了进一步封装成malloc接口,用户层程序一般都是通过调用malloc,由glibc间接调用brk来向内核申请用户空间。brk申请的用户空间属于堆空间 mmap系统调用也可以向内核申请用户空间,不过与brk不同的师,mmap申请的空间属于mma.

weixin_42730667的博客 1275

Windows剪贴板复制消息和内容截取

Windows应用程序开发Windows剪贴板复制消息和内容截取解决了什么问题实现思路实现过程1. 监听剪贴板内容更新消息2. 捕获剪贴板消息3. 获取剪贴板内容获取剪贴板文本信息获取剪贴板文件复制消息剪贴板粘贴消息的一些思考 Windows剪贴板复制消息和内容截取 解决了什么问题 在Windows应用开发的过程中,根据需求有时候会需要监控一下剪贴板,看看剪贴板的内容是否是我们应用程序感兴趣的内容。 比如下载器,往往会监控剪贴板内是否有下载链接,然后弹出下载页面 本文将一探究竟,自己实现一个当剪贴板内容有

find_the_ferry的博客 2239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

剪切板Hook

detour Windows剪切板是一种简单而且开销较小的IPC(InterProcess Communication,进程间通讯)机制,方便用户在不同程序间拷贝数据。在Windows操作系统中存在两种剪切板机制,即标准剪切板机制和OLE剪切板机制。 标准剪切板的基本机制是:Windows系统预留一块全局共享内存,提供数据的进程创建一个全局内存块,并将要传送的数据拷贝到内存中,接受数据的进程获

fengkuangfj的专栏 3205

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC的剪贴板操作的总结

本文主要介绍了VC++/MFC中如下内容的剪贴板操作:1、文本内容的操作2、WMF数据的操作3、位图的操作4、设置使用自定义格式5、感知剪贴板内容的改变6、自动将数据粘贴到另一应用程序窗口一、文本内容的操作下面的代码示范了如何将文本内容复制到剪贴板(Unicode编码的先转化为ASCII):CString source;//文本内容保存在source变量中if( OpenClipboard() )

梦想---软件设计师 2171

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用Visual C++实现OLE剪贴板

---- 一、概述---- 在Windows操作系统中存在两种剪贴板机制:Windows标准剪贴板和OLE剪贴板机制。---- 标准的Windows剪贴板是一个被所有Windows应用程序共享的系统服务,因此它并没有自己的句柄或类。但你可以通过CWnd类的成员函数来管理剪贴板。---- 自从OLE(Object Linking and Embedding,对象链接和嵌入)诞生之后,Windows操

我的编程之旅 2652

wxWidgets从剪切板获取数据

wxWidgets的剪切板实现windows下优先使用OLE接口,但是在使用OLE接口的时候对剪切板里面的数据处理中对部分格式采取了默认处理,有可能造成数据转换的错误,这个时候我们自己要写代码重新从剪切板里面读取数据,采用正确的格式转换数据处理!下面是一个示例函数:bool GetOleCli...

chenkuo4971的博客 333

OleSetClipboard: Failed to set mime data (text/plain) on clipboard: COM error 0xffffffff800401d0 (U

在创建新类或者GUI程序使用.ui方式之后,在MainWindows中使用QClipboard会报错,执行完clipboard->setText之后剪切板是空的。首先在MainWindows中创建信号和槽函数,主要是信号,槽函数只是起到一个使用剪切板的作用。现在问题又出现在怎么把MainWindows中的QString复制到剪切板中。后面发现在main.cpp中是可以用的。这里的槽函数是一个找QQ窗口的程序。在main.cpp中。

物极必反的博客 800

二. Windows 剪贴板

<br />一、概述 <br />---- 在Windows操作系统中存在两种剪贴板机制:Windows标准剪贴板和OLE剪贴板机 <br />制。 <br />---- 标准的Windows剪贴板是一个被所有Windows应用程序共享的系统服务,因此它并 <br />没有自己的句柄或类。但你可以通过CWnd类的成员函数来管理剪贴板。 <br />---- 自从OLE(Object Linking and Embedding,对象链接和嵌入)诞生之后, <br />Windows操作系统中便出现了第二种剪贴

hlfkyo的专栏 6310

剪贴板和OLE拖放

一、传统剪贴板      传统剪贴板的形式非常的简单,其基本思路是当复制时程序复制一个数据副本给全局内存对象,打开剪贴板并且清空剪贴板当中的数据,将全局内存对象复制给剪贴板最后关闭剪贴板;从剪贴板中获取数据的顺序是打开剪贴板获取全局内存对象,锁定全局内存对象后从中复制数据,解锁内存对象并且关闭剪贴板。需要注意的是剪贴板在某个时刻只能被一个程序所打开,如果试图打开一个已经被其他程序打...

570
上一篇: 我的2013,成功当选微软最有价值专家
下一篇: 【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值