我需要以多种格式将数据放在剪贴板上,一种是RTF。我正在使用的组件处理除了RTF之外的所有内容。如何附加RTF格式数据而不会吹走祖先类已存在的数据?如果有办法,我试图避免从我的副本中的祖先复制剪贴板逻辑到剪贴板例程。
答案 0 :(得分:4)
您可以通过执行以下操作附加到现有剪贴板数据:
Clipboard.Open
。Clipboard.SetAsHandle
,或SetClipboardData
通过您的RTF。Clipboard.Close
。只要继承的电话在您的Open/Close
对内,您就会获得所需的效果。
以下是我的意思:
procedure SetBuffer(Format: Word; const Buffer; Size: Integer);
var
DataPtr: Pointer;
Data: THandle;
begin
Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
try
DataPtr := GlobalLock(Data);
try
Move(Buffer, DataPtr^, Size);
Win32Check(SetClipboardData(Format, Data) <> 0);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
const
Text: string = 'foo';
begin
Clipboard.Open;
try
// imagine this next block is the base component's method to set the clipboard
Clipboard.Open;
try
Bitmap := GetFormImage;
try
Clipboard.Assign(Bitmap);
finally
Bitmap.Free;
end;
finally
Clipboard.Close;
end;
// once that is done, we can add out extra data
SetBuffer(CF_UNICODETEXT, Text[1], ByteLength(Text));
finally
Clipboard.Close;
end;
end;
因为我们一直在剪贴板上锁定,所以没有其他进程可以阻挡我们。并且基本组件方法将在开始添加文本之前清空剪贴板。