【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容
来源:互联网 发布:乌坦战争 知乎 编辑:程序博客网 时间:2024/05/01 02:56
目录如下:
1.《【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容》
http://blog.csdn.net/morewindows/article/details/17655053
2.《【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息》
http://blog.csdn.net/morewindows/article/details/17655057
3.《【MoreWindows工作笔记11】EnumClipboardFormats剪切板内容的数据格式》
http://blog.csdn.net/morewindows/article/details/17655299
4.《【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板》
http://blog.csdn.net/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.csdn.net/morewindows/article/details/17655053// By MoreWindows( http://blog.csdn.net/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.csdn.net/morewindows/article/details/17655053 -\n"); printf(" -- By MoreWindows( http://blog.csdn.net/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.csdn.net/morewindows/article/details/17655057)将介绍在复制粘贴文件时,剪贴板会存储什么格式的数据,如何使用这些数据,欢迎继续浏览。
本文地址:http://blog.csdn.net/morewindows/article/details/17655053 转载请标明出处,谢谢。
欢迎关注微博:http://weibo.com/MoreWindows
- 【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容
- 【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息
- 【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式
- 【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板
- 【MoreWindows工作笔记12】WM_DRAWCLIPBOARD 监视剪切板
- 【MoreWindows工作笔记5】StrFormatByteSize64 高端大气的显示文件大小
- 【MoreWindows工作笔记7】PathIsPrefix 判断路径的包含关系
- java的系统剪切板如何获取一个文本的内容
- 将文本的内容复制到剪切板,ZeroClipboard
- 【MoreWindows工作笔记2】 查看当前系统使用的字符集 GetSystemDefaultLocaleName
- 【MoreWindows工作笔记8】PathFindSuffixArrayW 路径是否有给定的后缀
- 查看剪切板的内容!
- 将文本内容添加到手机剪切板
- 【MoreWindows工作笔记6】PathCommonPrefix 路径公共前缀
- c++获取剪切板的内容
- 一段js实现复制文本内容到剪切板
- 【MoreWindows工作笔记1】 C/C++ 输出宽字符 printf + %ls or wcout
- 【MoreWindows工作笔记3】 使用cout/pintf输出16进制,8进制,2进制数据
- Android学习之 使用ContentProvider实现数据共享
- 开发机器学习应用程序的步骤总概
- 从内存分配角度分析c和java里的static 关键字.
- php的魔术方法__get(),__set(),__call(),__callStatic()以及static延迟静态绑定
- 谈谈关于内存对齐与补齐
- 【MoreWindows工作笔记9】OleGetClipboard 访问剪切板的文本内容
- Leetcode: Remove Nth Node From End of List
- 【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息
- 27-JAVA利用飞信接口发送短信
- Python学习笔记(十九)----Python 日期和时间
- 一些CPU架构模拟器
- 利用FPGA实现PCI总线接口及Windows驱动实现
- windows server 2008 远程桌面(授权、普通用户登录)~ ...
- 代码阅读工具SourceInsight