C++剪切板操作

原创 2011年01月11日 17:32:00

// 复制数据至剪切板
BOOL CopyToClipboard(const char* pszData, const int nDataLen)
{
   if(::OpenClipboard(NULL))       
//打开剪切板,失败返回0;
   {
       ::EmptyClipboard();   
//BOOL EmptyClipboard(VOID);    清空剪切板。
       HGLOBAL clipbuffer;    
//HGLOBAL 这个是windows 定义的数据类型。这是个句柄,标示一个内存区,不是指针。在对内存区的操作中,一般用指针,从这个handle可以得到指针,然后就可以对内存区进行操作了。
       char *buffer;
       clipbuffer = ::GlobalAlloc(GMEM_DDESHARE, nDataLen+1);

 GlobalAlloc
  该函数从堆中分配一定数目的字节数.Win32内存管理器并不提供相互分开的局部和全局堆.提供这个函数只是为了与16位的Windows相兼容.
  函数原型:
  HGLOBAL GlobalAlloc(
  UINT uFlags, // 分配属性(方式)
  DWORD dwBytes // 分配的字节数
  );  

参数uFlags:
  指定如何分配内存,若指定为0,则是默认的GMEM_FIXED.这个值可以是下面其中一个或几个位标识(那些指明不兼容的组合除外)
  标识的含意:
  GMEM_FIXED
  分配固定的内存,返回值是一个指针.
  GMEM_MOVEABLE
  分配可移动的内存,Win32中内存块在物理内存中是不可移动的,但在缺省堆中可以. 返回值是该内存对象的句柄,可使用函数 GlobalLock 将该句柄转换为一个指针.
  这个标识不能与 GMEM_FIXED 组合使用.
  GPTR 标识 GMEM_FIXEDGMEM_ZEROINIT组合.
  GHND 标识 GMEM_MOVEABLE GMEM_ZEROINIT的组合.
  GMEM_DDESHARE
  GMEM_SHARE
  这个标识是为与16Windows兼容而提供的,一些应用程序可使用该标识加强DDE操作的功能因此当内存用于DDE时可使用此标识.
  [DDE说明:DDE Dynamic Data Exchange 即动态数据交换。是 16 Windows 时代实现不同应用程序之间互相交换数据和控制的技术 ]
  GMEM_DISCARDABLE 标识
  被忽略.这个标识只是为与 16 Windows 相兼容而提供的. Win32 中你必须显式地调用函数 GlobalDiscard 以抛弃一块内存.
  这个标识可与 GMEM_FIXED 组合使用.
  GMEM_LOWER,GMEM_NOCOMPACT,GMEM_NODISCARD,GMEM_NOT_BANKED,GMEM_NOTIFY
  均被忽略. 这个标识只是为与 16 Windows 相兼容而提供的.
  GMEM_ZEROINIT
  将所申请内存初始化为0.
 参数dwBytes
  指定要申请的字节数.若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE 则该函数返回一个内存对象的句柄,该内存对象被标识为discarded(可抛弃的).
  返回值
  若函数调用成功,则返回一个新分配的内存对象的句柄.
  若函数调用失败,则返回 NULL.可调用 GetLastError 以获得更多错误信息.

      buffer = (char *)::GlobalLock(clipbuffer);     //锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。
       strcpy(buffer, pszData);
       ::GlobalUnlock(clipbuffer);    
//解锁
       ::SetClipboardData(CF_TEXT, clipbuffer);

 

   HANDLE SetClipboardData(
     UINT uFormat, // clipboard format
     HANDLE hMem // data handle
     );
一般情况,要先使用GlobalAlloc申请一块内存,GlobalAlloc的返回值就是SetClipboardData的第二个参数。然后,使用GlobalLock获得指向这个地址的指针,强制转换为你要的类型,然后将你的数据拷贝到这个区域即可。

         ::CloseClipboard(); //关闭剪切板
         return TRUE;
   }
   return FALSE;
}

//
从剪切板中取得数据
BOOL GetTextFromClipboard()
{
   if(::OpenClipboard(NULL))
   {
       //
获得剪贴板数据
       HGLOBAL hMem = GetClipboardData(CF_TEXT);
       if(NULL != hMem)
       {
           char* lpStr = (char*)::GlobalLock(hMem);
           if(NULL != lpStr)
           {
               //MessageBox(0, lpStr, "", 0);
               ::GlobalUnlock(hMem);
           }
       }
       ::CloseClipboard();
       return TRUE;
   }
   return FALSE;
}

//////////////////////////////////////////////////////////////////
模拟Ctrl+V
                    keybd_event(VK_CONTROL,0,0,0);
                   keybd_event('V',0,0,0);
                   keybd_event('V',0,KEYEVENTF_KEYUP,0);
                   keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

 

C++剪切板操作

 // 复制数据至剪切板BOOL CopyToClipboard(const char* pszData, const int nDataLen){    if(::OpenClipboard(NUL...
  • happy5856
  • happy5856
  • 2009年11月23日 10:21
  • 4611

剪贴板功能-C++实现

#include #include using namespace std; int main() { HWND hWnd = NULL; OpenClipboard( hWnd );/...
  • heihei36
  • heihei36
  • 2015年06月25日 14:40
  • 1870

C++进程通信之剪贴板

采用剪贴板的方式完成进程间的通信。
  • hk627989388
  • hk627989388
  • 2016年12月16日 15:17
  • 447

c++获取剪切板的内容

剪贴板内置在windows中,并且使用系统的内部资源RAM,或虚拟内存来临时保存剪切和复制的信息,可以存放的信息种类是多种多样的。剪切或复制时保存在剪贴板上的信息,只有再剪贴或复制另外的信息 ,或停...
  • hank0526
  • hank0526
  • 2017年05月13日 18:37
  • 1304

用代码操纵剪切板

拷贝与粘贴文本             下边的源代码演示了如何将文本(包含在CString对象“source”中)拷贝到剪贴板上。          CString   source;  ...
  • u011135902
  • u011135902
  • 2017年06月16日 08:58
  • 245

WINDOWS 剪切板操作

1. 基本API介绍在WINDOWS SDK 提供的几个剪切板操作函数:OpenClipboard 打开剪切板CloseClipboard 关闭剪切板EmptyClipboard 清空剪切板内容Get...
  • scuabin
  • scuabin
  • 2010年05月10日 20:17
  • 4449

c++将剪贴板内容保存为bmp图

C++读取word数据,word在剪贴板中的数据类型是HENHMETAFILE。 1.读取剪贴板数据转存emf文件 2.emf文件转bmp文件 3.使用...
  • hk627989388
  • hk627989388
  • 2016年11月21日 14:40
  • 969

Windows c++剪切板操作

Windows 下C++访问剪切板
  • myemailsz
  • myemailsz
  • 2016年07月22日 16:34
  • 472

APIHOOK实现剪贴板的控制

本人也是刚刚接触APIHook,写的也是入门的程序,希望本文对初学APIHook的人有所帮助。   文章之前先介绍下要利用的库Detours,这是微软提供的APIHook的库,具体的可以到网上查找。里...
  • reeves1576
  • reeves1576
  • 2008年02月21日 15:32
  • 559

Java剪切板操作大全

提起剪切板,一般都是在桌面系统或工具中使用。目前,操作Java剪切板有两种形式,这也对应着两种不同的技术Swing和JavaFX。而剪切板有可以分为系统剪切板和自定义剪切板。顾名思义,系统剪切板可以在...
  • alanzyy
  • alanzyy
  • 2015年10月14日 21:56
  • 2798
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++剪切板操作
举报原因:
原因补充:

(最多只允许输入30个字)