对剪贴板的内容的进行读取和设置

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

读剪贴板:        
  coledataobject   *pdo   =   new   coledataobject;  
  assert   (   afxisvalidaddress   (   pdo,   sizeof(coledataobject)   ));  
   
          if   (   !pdo->attachclipboard()   )  
  return;  
   
  //   determine   how   many   formats   are   available   on   the   clipboard.  
  pdo->beginenumformats();  
  while   (   pdo->getnextformat   (   &etc   ))  
  {  
   
  if   (   !pdo->isdataavailable   (   etc.cfformat   ))  
  continue;  
   
  //   get   an   hglobal   of   the   data.  
  hgdata   =   pdo->getglobaldata   (   etc.cfformat   );  
  if   (   null   !=   hgdata   )  
   
  delete   pdo;  
   
  设置剪贴板:  
  clipformat   cfformat;  
  coledatasource*   psource   =   new   coledatasource();  
  colestreamfile   file;  
  sf.openstream(strfilename,file);//strfilename为你的文件  
  dword   len   =   file.getlength();  
  hglobal   hg   =   globalalloc   (   gmem_moveable   |   gmem_share,len);  
  void*   pv   =   globallock   (   hg   );  
  assert(pv   !=   null);  
  file.read(pv,len);  
  ::globalunlock(hg);  
   
  ::openclipboard(null);  
  cfformat   =   ::registerclipboardformat(name);  
  ::closeclipboard();  
   
                    psource->cacheglobaldata(cfformat,   hg);   
 

拷贝与粘贴文本
 
下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。
CString source; 
//put your text in source
if(OpenClipboard())
{
         HGLOBAL clipbuffer;
         char * buffer;
         EmptyClipboard();
         clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
         buffer = (char*)GlobalLock(clipbuffer);
         strcpy(buffer, LPCSTR(source));
         GlobalUnlock(clipbuffer);
         SetClipboardData(CF_TEXT,clipbuffer);
         CloseClipboard();
}
 
反过来,下面的代码是用来实现从剪贴板上取得文本的。
char * buffer = NULL;
//open the clipboard
CString fromClipboard;
if ( OpenClipboard() ) 
{
         HANDLE hData = GetClipboardData( CF_TEXT );
         char * buffer = (char*)GlobalLock( hData );
         fromClipboard = buffer;
         GlobalUnlock( hData );
         CloseClipboard();
}

 
拷贝与粘贴WMF(enhanced)数据
 
你想在你的程序中往剪贴板上“画”以及向剪贴板读取图形吗?请放心,这个――不难!示范代码如下,其实现的是往剪贴板上写一enhanced metafile。
if ( OpenClipboard() )
{
         EmptyClipboard();
 
         //create the metafile DC
         CMetaFileDC * cDC = new CMetaFileDC();
         cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
 
         //call draw routine here that makes GDI calls int cDC
 
         //close meta CMetafileDC and get its handle
         HENHMETAFILE handle = cDC->CloseEnhanced();
 
         //place it on the clipboard
         SetClipboardData(CF_ENHMETAFILE,handle);
         CloseClipboard();
 
         //delete the dc
         delete cDC;
}
 
好啦,该演示反过来怎么做的代码了。我们从剪贴板上取得metafile并将其画到自己的应用程序的客户区DC(设备上下文)上(仅仅是个试验而已,实际上你可能更想将它拷贝一份儿)。
if ( OpenClipboard() )
{
         //Get the clipboard data
         HENHMETAFILE handle = (HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE);
 
         //play it into a DC (our own DC in this example)
         CClientDC dc(this);
         CRect client(0,0,200,200);
         dc.PlayMetaFile(handle,client);             
 
         //close the clipboard
         CloseClipboard();
}

拷贝与粘贴一张位图(BitMap)
 
拷贝和粘贴位图可是需要一些微妙的处理的,不过基本的思想还是一样。请看下面的代码。
if ( OpenClipboard() )
{
         EmptyClipboard();
         //create some data
         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);
 
         //call draw routine here that makes GDI calls
         DrawImage(&dc,CString("Bitmap"));
 
         //put the data on the clipboard
         SetClipboardData(CF_BITMAP,junk->m_hObject);
         CloseClipboard();
 
         //copy has been made on clipboard so we can delete
         delete junk;
}
 
如下示例代码是从剪贴板上取得一张位图,将它粘贴到客户区DC中。
if ( OpenClipboard() )
{
         //Get the clipboard data
         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() API函数先将此格式注册,然后就可以“为所欲为”了。这简直是太有用了,尤其是在我们自己的应用程序中拷贝资料。假设我们有下面的结构:
struct MyFormatData
{
         long val1;
         int val2;
};
 
想将此结构的数据拷贝到剪贴板上。可以这样实现:
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
if(OpenClipboard())
{
         //make some dummy data
         MyFormatData data;
         data.val1 = 100;
         data.val2 = 200;
 
         //allocate some global memory
         HGLOBAL clipbuffer;
         EmptyClipboard();
         clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));
         MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
 
         //put the data into that memory
         *buffer = data;
 
         //Put it on the clipboard
         GlobalUnlock(clipbuffer);
         SetClipboardData(format,clipbuffer);
         CloseClipboard();
}
 
想把它从剪贴板上读下来的话,也容易:
 
//第二次调用时,此格式已经注册过了,读下来就行了
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyFormatData data;
if ( OpenClipboard() ) 
{
         //get the buffer
         HANDLE hData = GetClipboardData(format);
         MyFormatData * buffer = (MyFormatData *)GlobalLock( hData );
 
         //留一份儿当地拷贝
         data = *buffer;
 
         GlobalUnlock( hData );
         CloseClipboard();
}
 

 
取得剪贴板变化通知(Getting notified of clipboard changes)
 
一旦剪贴板上的内容发生改变,我们都希望能够获知(经由windows消息),这是很有用的。你可以用函数SetClipboardViewer()来捕获WM_DRAWCLIPBOARD消息。
 
在你的初始化代码中调用:
         SetClipboardViewer();  //add us to clipboard change notification chain
 
在你的消息映射(message map)中添加:
         ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange)  //clipboard change notification
 
将其定义为:
         afx_msg void OnClipChange();  //clipboard change notification
 
实现为:
void CDetectClipboardChangeDlg::OnClipChange() 
{
         //do something here, for example
         CTime time = CTime::GetCurrentTime();
         SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
 
         DisplayClipboardText();
}

 
将数据粘贴到其它应用程序窗口中的方法
 
我觉得如果能把文本拷贝到剪贴板上(参见上面的代码),然后再在另外一个应用程序中将这些文本粘贴过来,那样才有用。我写了一个很不错的本地应用程序,此程序使用了含有此技术的第三方的语言翻译包。很简单,仅是取得目标窗口的句柄,并向它发送“PASTE”消息就OK了。
         SendMessage(m_hTextWnd, WM_PASTE, 0, 0);
读取剪贴板文件信息 哎,今天来了一个临时功能,要求我将剪贴板中的文件信息做处理,尽管框架没有什么关系,但还是要实现。系统剪贴板内容说白了就是在特定的时间内存分配的一个区域,随后复制的内容都会取代先前的内容,在C#中操作剪贴板我需要使用到System.Windows.Forms.Clipboard类.只实现读取剪贴板中复制的文件很简单代码如下:          private void button1_C 阅读详情

相关推荐

Qt实现复制文件内容剪贴板(附完整源码)

Qt实现复制文件内容剪贴板(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 709

剪析板基本操作

Clipboard 问答集在我们自己的VC++ / MFC应用程序中增加剪贴板功能其实是很简单的事情。为了让你的程序可以与剪贴板对话,本文就其实现中的一些基本问题做一些实例讲解。拷贝与粘贴文本下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。CString source;//put your text in sourceif(Open

修行中... 1356

易语言实现文件复制到剪贴板完整源码教程

易语言是一款专为中文用户设计的可视化编程语言,凭借其直观的界面与简洁的语法,成为Windows平台小型应用开发的理想选择。本章将从开发环境搭建入手,详细介绍如何安装易语言集成开发环境(IDE),并配置基本的编译与调试环境。随后,我们将逐步讲解易语言的基础语法结构,包括变量定义、数据类型(如整数型、文本型、逻辑型等)、运算符的使用以及基本流程控制语句(如判断、循环)。通过编写一个简单的“Hello World”程序,读者将快速上手并理解程序执行的基本流程。

weixin_34438187的博客 1124

vc类与头文件

Class   Header   file   CAnimateCtrl   afxcmn.h   CArchive   afx.h   CArchiveException   afx.h   CArray   afxtempl.h   CAsyncMonikerFile   afxole.h   CAsyncSocket   afxsock.h   CBitmap   afxwin.h   CB

717

istorage 封装 结构化存储_cpp-docs.zh-cn/colestreamfile-class.md at live · MicrosoftDocs/cpp-docs.zh-cn · Gi...

descriptiontitlems.datef1_keywordshelpviewer_keywordsms.assetidms.openlocfilehashms.sourcegitcommitms.translationtypems.contentlocalems.lasthandoffms.locfileid了解详细信息: COleStreamFile 类COleStreamFile 类1...

weixin_33048721的博客 199

拓展Electron的剪切板

拓展Electron的剪切板 A better clipboard for Electron (NodeJS). Install npm i better-clipboard electron-rebuild -f -w better-clipboard Usage import { betterClipboard } from 'better-clipboard'; betterClipboard.readFilePathList(); // get the path of file which i

未思 1426

vc获取剪贴板文本内容

前言: 本文目前仅限于获取设置剪贴板的文本内容,还未涉及到图片等资源; 示例: 一:设置剪贴板文本内容(支持一般符号,特殊符号未测试) bool SetClipBoardText(LPCSTR text,HWND hWnd) { ASSERT(hWnd); //打开剪贴板 if ( !::OpenClipboard(hWnd) ) return fa

qingzai_的专栏 5590

[python]python 获取剪切板内容的两种方法

待实现需求:将目标值先写入粘贴板、然后模拟键盘的Ctrl+V获取已写入粘贴板的内容。所需的文件:ClipboardUtil.py、TestSendMain.py。

FL1768317420的博客 756

js 判断剪切板内容是否为text_JS获取剪贴板内容的方法

这两天弄fckeditor粘贴功能,随着工作的深入在网上查询资料,知道了在网页中一般是不允许访问“剪贴板”的,因为这样存在着很大的安全隐患,自己也尝试着写了一个简单的demo。在IEFF中剪贴板的访问是可控的,但是在Opera、Chrome、Safari浏览器中是不允许访问的,这样就产生了浏览器兼容的问题,怎么样才能让其他的浏览器兼容这个功能呢,在网上查找了一些资料——“使用flash去访问剪...

weixin_34184847的博客 1010

C#操作剪贴板

System.Windows(WPF)或System.Windows.Forms(Winform)下。1 data.GetDataPresent(typeof(Bitmap)) 返回true。7 MessageBox.Show("剪切版为空");从剪切板上获得数据不影响剪贴板内容,GetData的返回值是存储在剪贴板上的副本。如果设置为false,或者不设置,将在程序运行结束后不保留剪切板内容。要想从剪切板获得一个对象,可以调用 GetData()方法。

【微软MVP】zhaotianff的专栏 1048

python用pyperclip读写剪贴板

安装pyperclip 安装命令 pip install pyperclip 读剪贴板剪贴板上的内容读出,存入一个变量中。 import pyperclip string = pyperclip.paste() # 从剪贴板读取字符串 print(string) 这段程序会将你复制到剪贴板上的字符串读取出来放到string变量中。 写剪贴板 import pyperclip pyperclip.copy("字符串") # 将字符串写入到剪贴板 这段程序会将pyperclip.copy(“

LMX的博客 1537

取当前单元格数据到剪贴板

<br />是将当前单元格中的值传至dataobject中,然后dataobject再将值传至剪贴板(clipboard)中,最后使用paste方法,将值传至另一个text控件中,具体程序如下所示: <br /> Dim MyData As DataObject Private Sub CommandButton1_Click() Set MyData = New DataObject '在把文本复制到剪切板之前,需要选定一有文本单元格 MyData.SetText (Active

liuyukuan的专栏 1292

js 判断剪切板内容是否为text_JS实现获取剪贴板内容的方法

本文实例讲述了JS实现获取剪贴板内容的方法。分享给大家供大家参考,具体如下:这里介绍了JS获取剪贴板内容的代码:<ScriptLanguage="JavaScript">varcontent=clipboardData.getData("Text");if(content!=null){document.write("<center><fontsize=5...

weixin_39589253的博客 242

JavaScript 粘贴事件、拷贝事件、获取拷贝的内容、将文本复制到剪贴板

JavaScript 粘贴事件、拷贝事件、获取拷贝的内容、将文本复制到剪贴板

 我的博客 3841

Unity Editor 复制内容剪贴板

GUIUtility.systemCopyBuffer = "内容" 同理:获取剪贴板内容也是 “内容” = GUIUtility.systemCopyBuffer

JH_Wiki的专栏 2726

android 剪贴板服务,Android剪贴板用法详解

本文实例详述了Android剪贴板的用法,分享给大家供大家参考。具体方法分析如下:这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管是安卓设备还是PC机,复制粘贴在同一时间里只能用于一个对象上,整通俗点就是:PC机上,不可能同时从C盘复制,又从D盘复制就行了,具体的看代码,很简单,直接上代码:package com.xiaoma.clipboard.demo;i...

weixin_39990558的博客 617

perl 剪贴板操作

以下代码设置剪贴板内容为 hello world,然后读取剪贴板内容   use Win32::Clipboard; $clip = Win32::Clipboard-&gt;new(); $clip-&gt;Set("hello world"); $val = $clip-&gt;Get(); print $val;   如果你用鼠标键盘操作选中一个文件 ctrl-v...

zk1878的专栏 541

electron 剪贴板 截图_通过Electron Framework掌握剪贴板的使用

本文概述现代GUI通常提供一个剪贴板管理器, 该管理器支持多个剪切粘贴事务。在此模型中, 剪贴板被视为一叠或剪贴簿, 新的剪切副本被放置在最近事务列表的顶部。如果你的电子应用默认情况下阻止任何键盘事件, 并且你想根据自己的用户操作来过滤事件(或者只是看中并在UI中添加复制/粘贴按钮), 则你可能想知道如何手动处理剪贴板。进入Clibpoard要访问剪贴板, 我们将使用以下行:const {cl...

weixin_35799770的博客 638
上一篇: Packet Sniffers
下一篇: visual c++剪贴板操作不完全攻略
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值