如何在不删除现有数据的情况下以新格式将数据附加到现有剪贴板?
How do I append data to existing clipboard in a new format without removing the existing data?
我需要以多种格式将数据放入剪贴板,其中一种是 RTF。我正在使用的组件可以很好地处理除 RTF 之外的所有内容。我怎样才能追加 RTF 格式数据而不吹走祖先已经放置在那里的数据 class?如果有办法的话,我试图避免将我的副本中祖先的剪贴板逻辑复制到剪贴板例程。
您可以通过执行以下操作附加到现有剪贴板数据:
- 呼叫
Clipboard.Open
.
- 调用将其他数据放入剪贴板的基本 class 方法。
- 致电
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;
因为我们一直锁定剪贴板,所以没有其他进程可以阻止我们。基本组件方法将在开始添加文本之前清空剪贴板。
我需要以多种格式将数据放入剪贴板,其中一种是 RTF。我正在使用的组件可以很好地处理除 RTF 之外的所有内容。我怎样才能追加 RTF 格式数据而不吹走祖先已经放置在那里的数据 class?如果有办法的话,我试图避免将我的副本中祖先的剪贴板逻辑复制到剪贴板例程。
您可以通过执行以下操作附加到现有剪贴板数据:
- 呼叫
Clipboard.Open
. - 调用将其他数据放入剪贴板的基本 class 方法。
- 致电
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;
因为我们一直锁定剪贴板,所以没有其他进程可以阻止我们。基本组件方法将在开始添加文本之前清空剪贴板。