C++进程间通信之剪贴板
转载//blog.csdn.net/hk627989388/article/details/53693636
转载//blog.csdn.net/heihei36/article/details/46636275
转载//bbs.csdn.net/topics/392043890
//GMEM_FIXED 分配固定的内存,返回值是一个指针.
//GMEM_MOVEABLE
//分配可移动的内存,在Win32中内存块在物理内存中是不可移动的,但在缺省堆中可以. 返回值是该内存对象的句柄,可使用函数 GlobalLock 将该句柄转换为一个指针.
//这个标识不能与 GMEM_FIXED 组合使用.
//ansi
void SetClipboardByAnsi()
{
HWND hWnd = NULL;
HANDLE hHandle;//保存调用GlobalAlloc函数后分配的内存对象的句柄
string strTemp;
char *pBuf;//保存调用AllocLock函数后返回的内存地址
OpenClipboard( hWnd );//打开剪切板
EmptyClipboard();//清空剪切板
strTemp="巴萨VS皇马";
hHandle = GlobalAlloc(GMEM_MOVEABLE, strTemp.length()+1);//分配内存
if (hHandle)//若函数调用失败,则返回NULL
{
pBuf = (char*) GlobalLock(hHandle);//锁定内存,返回申请内存的首地址
//wcscpy(pBuf, strTemp.c_str());
strcpy(pBuf, strTemp.c_str());
GlobalUnlock(hHandle);//解除锁定
SetClipboardData(CF_TEXT, hHandle);//设置剪切板数据
CloseClipboard();//关闭剪切板
}
}
//Unicode
void SetClipboardByUnicode()
{
// 打开剪贴板
if (!OpenClipboard(NULL)|| !EmptyClipboard())
{
printf("打开或清空剪切板出错!\n");
return ;
}
HANDLE hHandle;//保存调用GlobalAlloc函数后分配的内存对象的句柄
wstring strText = L"宽字符测试剪切板";
//hHandle = GlobalAlloc(GMEM_MOVEABLE, strText.length()+1);//错误的
hHandle = GlobalAlloc(GMEM_MOVEABLE, ((wcslen(strText.c_str()))*sizeof(TCHAR))*2);
if (hHandle)//若函数调用失败,则返回NULL
{
LPWSTR lpStr = (LPWSTR)GlobalLock(hHandle);
wcscpy(lpStr, strText.c_str());
GlobalUnlock(hHandle);//解除锁定
SetClipboardData(CF_UNICODETEXT, hHandle);//设置剪切板数据
CloseClipboard();//关闭剪切板
}
}
void GetClipboard()
{
OpenClipboard(NULL);//打开剪切板
if (IsClipboardFormatAvailable(CF_UNICODETEXT))//剪切板上是否存在文本格式
{
HANDLE hClip;
wchar_t* pBuf;
hClip = GetClipboardData(CF_UNICODETEXT);//获取剪切板文本数据
pBuf = (wchar_t*)GlobalLock(hClip);
GlobalUnlock(hClip);
wstring temp = pBuf;
wprintf(L"%s",pBuf);
}
}
int main()
{
//SetClipboardByAnsi();
//SetClipboardByUnicode();
GetClipboard();
getchar();
return 0;
}
还没有评论,来说两句吧...