// 复制数据至剪切板
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_FIXED和GMEM_ZEROINIT组合.
GHND 标识 为GMEM_MOVEABLE 和 GMEM_ZEROINIT的组合.
GMEM_DDESHARE
GMEM_SHARE
这个标识是为与16位Windows兼容而提供的,一些应用程序可使用该标识加强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);