剪贴板的API操作

OpenClipboard函数

多个软件之间进行数据共享是非常重要的,难以想像编辑软件没有CTRL+C,CTRL+V的功能,是多么的不方便。很多的操作,就是拷贝的动作,就是为了数据共享。剪贴板共享是Windows里比较重要的功能,比如很多采集数据的软件为了方便导数据到excel里面,就可以使用剪贴板的功能。还有即见即所得的界面导到word里面,也可以使用剪贴板的功能。

函数OpenClipboard声明如下:

WINUSERAPI
BOOL
WINAPI
OpenClipboard(
__in_opt HWND hWndNewOwner);

hWndNewOwner是前贴板所属于的窗口。

调用函数的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//拷贝数据到剪贴板。
//蔡军生 2007/12/09 [qq](http://tech.ddvip.com/qq/index.html):9073204 深圳
void TestClipBoard(void)
{
//打开剪贴板并清空。
if (OpenClipboard(m_hWnd) &&
EmptyClipboard())
{
HGLOBAL hMem;
std::wstring strText(_T("拷贝数据到剪贴板"));
//分配全局内存。
hMem = GlobalAlloc(GMEM_MOVEABLE,
(strText.length() + 1) * sizeof(TCHAR));
if (hMem == NULL)
{
CloseClipboard();
return;
}

//拷贝数据到剪贴板内存。
LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);
memcpy(lpStr, strText.c_str(),
strText.length() * sizeof(TCHAR));
lpStr[strText.length()] = (TCHAR) 0;
GlobalUnlock(hMem);

//设置数据到剪贴板
SetClipboardData(CF_UNICODETEXT, hMem);

//关闭剪贴板。
CloseClipboard();
}
}

GetClipboardData

前面介绍怎么样把数据放到剪贴板里面,那么又是怎么样从剪贴板里面获取数据出来呢?当然还是需要使用其它的API函数来获取剪贴板里的数据。获取剪贴板里的数据时,是不知道当前剪贴板里是否有数据的,也不知道剪贴板里的数据格式是什么。那么下面就来解决这两个问题,先使用函数IsClipboardFormatAvailable来获取剪贴板里的格式是否可以处理,接着使用函数OpenClipboard打开剪贴板,然后使用函数GetClipboardData来获取剪贴板数据。

函数GetClipboardData声明如下:

WINUSERAPI
HANDLE
WINAPI
GetClipboardData(
__in UINT uFormat);
uFormat是剪贴板的格式。

调用函数的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//获取剪贴板的数据。
//蔡军生 2007/12/10 [qq](http://tech.ddvip.com/qq/index.html):9073204 深圳
void TestGetClipBoard(void)
{
//判断剪贴板的数据格式是否可以处理。
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
{
return;
}

//打开剪贴板。
if (!OpenClipboard(m_hWnd))
{
return;
}

//获取UNICODE的数据。
HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT);
if (hMem != NULL)
{

//获取UNICODE的字符串。
LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);
if (lpStr != NULL)
{

//显示输出。
OutputDebugString(lpStr);

//释放锁内存。
GlobalUnlock(hMem);
}
}

//关闭剪贴板。
CloseClipboard();
}