以下是将剪贴板中的RTF格式保存到流中,以及从流中恢复到剪贴板中的代码,我已经用了几年了,可以满足你的要求。<br>{***************************************************************<br> *<br> * 单元名 : UtFunction<br> * 描述 : 通用的函数<br> * 创建者 : zwz_good<br> * 创建日期 : 2005-12-25<br> * 修改者 : zwz_good<br> * 修改日期 : 2006-4-25<br> ****************************************************************}<br>{******************************************************************************<br>函 数 名:ClipboardRTFSaveToStream<br>说 明:将剪贴板中的RTF格式内容保存到流中<br>输入参数:mStream: TStream 待保存内容的流媒体<br>输出参数:无<br>返 回 值:成功为True,失败为False<br>全局变量:无<br>数 据 库:<br>调 用:无<br>*******************************************************************************}<br>function ClipboardRTFSaveToStream(var mStream: TStream): boolean;<br><br>{******************************************************************************<br>函 数 名:ClipboardRTFLoadFromStream<br>说 明:将流中的内容以RTF格式复制到剪贴板中<br>输入参数:mStream: TStream 待复制到剪贴板中的流媒体<br>输出参数:无<br>返 回 值:成功为True,失败为False<br>全局变量:无<br>数 据 库:<br>调 用:无<br>*******************************************************************************}<br>function ClipboardRTFLoadFromStream(var mStream: TStream): boolean;<br>const<br> RTFFormatName: array[1..17] of AnsiChar = ('R','i','c','h',' ','T','e','x','t',' ',<br> 'F','o','r','m','a','t', #0);<br>function ClipboardRTFSaveToStream(var mStream: TStream): boolean;<br>var<br> iFormat: cardinal;<br> buffer: array[0..127] of AnsiChar;<br> hGlobal: THANDLE;<br> pGlobal: PAnsiChar;<br> FormatSize: cardinal;<br>begin<br>// 'Rich Text Format'<br> Result:= False;<br> mStream.Position:= 0;<br> //OpenClipboard(Application.Handle);<br> Clipboard.Open;<br> try<br> iFormat:= EnumClipboardFormats(0);<br> while iFormat <> 0 do<br> begin<br> if iFormat > 49151 then //49152--65535之间的值才是自定义剪贴板格式,才可以用 GetClipboardFormatName取得名字<br> begin<br> zeromemory(@buffer, sizeof(AnsiChar)*128);<br> GetClipboardFormatName(iFormat, @buffer, 128);<br> if StrComp(@RTFFormatName, @buffer) = 0 then<br> begin<br> hGlobal:= GetClipboardData(iFormat);<br> pGlobal:= GlobalLock(hGlobal);<br> FormatSize:= GlobalSize(hGlobal);<br> mStream.Write(FormatSize, SizeOf(Cardinal));<br> mStream.Write(pGlobal^, FormatSize);<br> GlobalUnLock(hGlobal);<br> Result:= True;<br> break; //保存RTF完成后,退出循环.<br> end;<br> end;<br> iFormat:= EnumclipboardFormats(iFormat);<br> end;<br> finally<br> Clipboard.Close;<br> end;<br>end;<br><br>function ClipboardRTFLoadFromStream(var mStream: TStream): boolean;<br>var<br> hGlobal: THANDLE;<br> pGlobal: PAnsiChar;<br> iFormat: cardinal;<br> FormatSize: cardinal;<br>begin<br> Result:= False;<br> iFormat:= RegisterClipboardFormat(@RTFFormatName);<br> mStream.Read(FormatSize, SizeOf(cardinal));<br> hGlobal:= 0;<br> hGlobal:= GlobalAlloc(GHND + GMEM_SHARE, FormatSize);<br> if hGlobal > 0 then<br> begin<br> pGlobal:= GlobalLock(hGlobal);<br> //复制数据<br> mStream.Read(pGlobal^, FormatSize);<br> GlobalUnlock(hGlobal);<br> //打开剪贴板将内存句柄交给剪贴板<br> Clipboard.Open;<br> EmptyClipboard();<br> SetClipboardData(iFormat, hGlobal);<br> Clipboard.Close;<br> Result:= True;<br> end;<br>end;