VC++剪切板简单操作

经常在论坛上见到一些使用者询问如何在Visual C++中如何实现对剪贴板的操作,其实在VC++/MFC中是相当简单的。本文主要介绍了如下内容: 1、文本内容的操作 2、WMF数据的操作 3、位图的操作 4、设置使用自定义格式 5、感知剪贴板内容的改变 6、自动将数据粘贴到另一应用程序窗口
一、文本内容的操作 下面的代码示范了如何将文本内容复制到剪贴板:
Cstring source; //文本内容保存在source变量中 if(openClipboard()) { HGLOBAL clipbuffer; char * buffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1); buffer = (char*)GlobalLock(clipbuffer); Strcpy(buffer, LPCSTR(source)); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT,clipbuffer); CloseClipboard(); }
下面的代码显示了如何从剪贴板上获得文本内容:
char * buffer = NULL; //打开剪贴板 CString fromClipboard; if ( OpenClipboard() ) { HANDLE hData = GetClipboardData(CF_TEXT); char * buffer = (char*)GlobalLock(hData); fromClipboard = buffer; GlobalUnlock(hData); CloseClipboard(); }
二、WMF数据的操作
  在剪贴板上读写图象数据是非常有用的功能,并且实现起来也很简单。下面的代码显示了如何将扩展图元文件复制到剪贴板:
if(OpenClipboard()); { EmptyClipboard();
//创建图元文件DC CMetaFileDC * cDC = new CMetaFileDC(); cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//调用绘图例程
//关闭CMetafileDC并获得它的句柄 HENHMETAFILE handle = cDC->CloseEnhanced();
//复制到剪贴板 SetClipBoardData(CF_ENHMETAFILE,handle); CloseClipboard();
//删除dc delete cDC; }
下面的代码演示了从剪贴板获得图元文件并将其绘制到client DC上:
if(OpenClipboard()) { //获得剪贴板数据 HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//显示 CClientDC dc(this); CRect client(0,0,200,200); dc.PlayMetaFile(handle,client);
//关闭剪贴板 CloseClipboard(); } 三、位图的操作
位图的操作稍微复杂一点,下面这个例子显示了如何在剪贴板保存位图:
if(OpenClipboard()) { EmptyClipboard(); CBitmap * junk = new CBitmap(); CClientDC cdc(this); CDC dc; dc.CreateCompatibleDC(&cdc); CRect client(0,0,200,200); junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height()); dc.SelectObject(junk);
DrawImage(&dc,CString("Bitmap"));
//复制数据到剪贴板 SetClipboardData(CF_BITMAP,junk->m_hObject); CloseClipboard();
delete junk; }
下面的代码显示了如何从剪贴板上获得位图数据:
if(OpenClipboard()) { //获得剪贴板数据 HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP); CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this); CDC dc; dc.CreateCompatibleDC(&cdc); dc.SelectObject(bm); cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard(); }
四、设置并使用自定义格式
使用RegisterClipboardFormat()函数,可以复制和粘贴任何你需要的数据类型。比如我们有以下一个数据类型:
struct MyFormatData { long val1; int val2; };
我们要把它复制到剪贴板,可以使用如下的代码:
UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT"); if(OpenClipboard()) { MyFormatData data; data.val1 = 100; data.val2 = 200;
HGLOBAL clipbuffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData)); MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
//保存到内存 *buffer = data;
//保存到剪贴板 GlobalUnlock(clipbuffer); SetClipboardData(format,clipbuffer); CloseClipboard(); }
读取数据使用以下代码:
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); MyFormatData data; if(Openclipboard()) { HANDLE hData =GetClipboardData(format); MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData); CloseClipboard(); }
五、感知剪贴板内容的改变
通过Windows消息可以感知剪贴板内容是否发生改变,代码如下:
In your initialization code call: SetClipboardViewer(); //将我们的程序添加到剪贴板观察链
In your message map add: ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle
Which is declared as: afx_msg void OnClipChange();
Finally implement: void CDetectClipboardChangeDlg::OnClipChange() { CTime time = CTime::GetCurrentTime(); SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
DisplayClipboardText(); }
六、自动将数据粘贴到另一应用程序窗口
只需获得相应窗口的句柄,并发送一个消息就可以了:
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
简单的说:

一、打开剪切板

OpenClipboard();

二、获得指向剪切板的全局指针变量

HANDLE hClipMemory=::GetClipboardData(CF_TEXT);

三、锁定剪切板

LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);

四、获取剪切板内容

CString m_sMessage = CString(lpClipMemory);

五、解锁剪切板

GlobalUnlock(hClipMemory);

六、关闭剪切板

::CloseClipboard();

读取剪切板内容必须先锁定剪切板,否则会发生异常。以上只能读取文本格式的内容,无法读取位图,具体请查阅MSDN帮助文档。

时间: 2024-08-06 15:23:00

VC++剪切板简单操作的相关文章

Java中有关剪切板的操作

Java提供两种类型的剪贴板:系统的和本地的. 本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问. 系统剪贴板与同等操作系统直接关连,允许应用程序与运行在该操作系统下的其它程序之间进行信息交换. 在进一步深入之前,先看看与剪贴板相同的java类,这些类主要包含在java.awt.datatransfer包中,主要有以下几种: Clipboard类: 此类实现一种使用剪切/复制/粘贴操作传输数据的机制. ClipboardOwner接口:

简单实现兼容各大浏览器的js复制内容到剪切板

因为网站文章需要提供几个按钮,单击后实现复制文章内容到剪贴板. 在网上搜索了很多内容,发现都比较乱这里自己整理下,分享给大家 效果图如下: 之前使用的是window.clipboardData.setData,只能支持IE和火狐.360浏览器.搜狗等浏览器,都泪崩.所以,研究了ZeroClipboard,尽量使用js代码写. 使用前先引用三个东西(没有提供上传附件,这里就不提供下载地址了,很常见,大家自己找度娘吧): jquery-1.4.1.min.js    ZeroClipboard.js

C# 使用WinApi操作剪切板Clipboard

前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装了能实现这种功能的方法 然后就有了如下代码 1 string Temp = ""; 2 while (true) 3 { 4 string Tex = Clipboard.GetText().ToString(); 5 if (!string.IsNullOrWhiteSpace(Tex)

对c#剪切板Clipboard占用的问题一点解决方法

以前在百度写的文档,转移到此处 前几天做一个程序,其中有一个剪切板的操作,具体代码: Clipboard.SetText(“ABC”); 来完成一个复制字符串的操作. 自己调试通过,完全正常,然后就交给一位朋友做测试.但是他告诉我这个复制操作总是引起崩溃.并弹出“请求剪切板失败”的提示.于是在网上找了一下相关的内容,原来是不同进程之间争用剪切板引起的,剪切板是系统的公用资源,大多数软件都会提供对该区域访问的操作,就以迅雷为例:迅雷有一个监视剪切板的功能,具体实现不清楚,但肯定的是会经常去访问剪切

【转载】VC操作剪切板

1.在剪切板上放置数据 if(OpenClipboard())    //打开剪切板{    EmptyClipboard(); //清空剪切板    CString str;       //从控件中取出字符    HANDLE hclip;      //GlobalAlloc分配内存的句柄    char *buf;         //返回的内存地址    GetDlgItemText(IDC_EDIT_SEND,str);    //取字符    hclip=GlobalAlloc(G

MFC中对于剪切板的简单操作

以ASCII编码的文本为例: 复制操作: char sc[]="要复制的文本"; HGLOBAL hmem=NULL; if (OpenClipboard()) //是否成功打开剪帖板 {     if (EmptyClipboard())//清空成功,则继续     {         hmem=GlobalAlloc(GHND,sizeof(sc));//memalloc strlen+1 \0         char* pmem= (char*)GlobalLock(hmem)

C#操作剪切板(Clipboard)

剪切板是Windows系统提供的功能,从我最早接触到的Windows 3.2版本开始,就一直带着了.以前使用C++的时候,是直接使用Windows API对其进行操作的,到了.NET下,在WinForm中也有一个对剪切板的封装类,即System.Windows.Forms.Clipboard,这个类其实是通过COM组件间接地使用剪切板的,我个人觉得COM是一个设计非常糟糕的东西,难懂坑多还不可移植,但微软现存的大量代码又是基于COM的,所以又无法彻底舍弃,关于不可移植这个并不难理解,前面说了,剪

window.clipboardData实现剪切板操作总结

window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataFormat) 删除剪贴板中指定格式的数据.sDataFormat:"text","url" (2)getData(sDataFormat) 从剪贴板获取指定格式的数据. sDataFormat:"text","url" (3)setDat

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。

最近做一个蛋疼的东西就是C#调用windows API 来操作一个 软件,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true)等. 本来测试的时候,通过主线程 按钮点击开始的时候没有任何问题.但是把整个过程放在一个单独一个线程的时候一到复制的时候就报错, “在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记”.但是查看我的主线程main