浅析Windows编程的剪贴板机制

本文介绍了Windows系统的剪贴板机制,包括进程间通讯、数据存储、API函数和消息使用。剪贴板通过全局共享内存进行数据交换,提供了文本和位图等数据格式。延迟提交技术有效利用内存,避免资源浪费。文章详细阐述了如何使用和管理剪贴板数据,包括打开、设置、获取数据以及处理延迟提交的相关消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows剪贴板

  Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制。Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,用来暂存在各进程间进行交换的数据:提供数据的进程创建一个全局内存块,并将要传送的数据移到或复制到该内存块;接受数据的进程(也可以是提供数据的进程本身)获取此内存块的句柄,并完成对该内存块数据的读取。

  为使剪贴板的这种IPC机制更加完善和便于使用,需要解决好如下三个问题:提供数据的进程在结束时Windows系统将删除其创建的全局内存块,而接受数据的进程则希望在其退出后剪贴板中的数据仍然存在,可以继续为其他进程所获取;能方便地管理和传送剪贴板数据句柄;能方便设置和确定剪贴板数据格式。为完善上述功能,Windows提供了存在于USER32.dll中的一组API函数、消息和预定义数据格式等,并通过对这些函数、消息的使用来管理在进程间进行的剪贴板数据交换。

  Windows系统为剪贴板提供了一组API函数和多种消息,基本可以满足编程的需要。而且Windows还为剪贴板预定义了多种数据格式。通过这些预定义的格式,可以使接收方正确再现数据提供方放置于剪贴板中的数据内容。

文本剪贴板和位图剪贴板的使用

  这两种剪贴板是比较常用的。其中,文本剪贴板是包含具有格式CF_TEXT的字符串的剪贴板,是最经常使用的剪贴板之一。在文本剪贴板中传递的数据是不带任何格式信息的ASCII字符。若要将文本传送到剪贴板,可以先分配一个可移动全局内存块,然后将要复制的文本内容写入到此内存区域。最后调用剪贴板函数将数据放置到剪贴板:

DWORD dwLength = 100; // 要复制的字串长度
	HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1); // 分配内存
	LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory); // 锁定内存
	for (int i = 0; i < dwLength; i++) // 将"*"复制到全局内存块
		 *lpGlobalMemory++ = '*';
	GlobalUnlock(hGlobalMemory); // 锁定内存块解锁
	HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄
	::OpenClipboard(hWnd); // 打开剪贴板
	::EmptyClipboard(); // 清空剪贴板
	::SetClipboardData(CF_TEXT, hGlobalMemory); // 将内存中的数据放置到剪贴板
	::CloseClipboard(); // 关闭剪贴
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值