如何在不删除现有数据的情况下以新格式将数据附加到现有剪贴板?

How do I append data to existing clipboard in a new format without removing the existing data?

我需要以多种格式将数据放入剪贴板,其中一种是 RTF。我正在使用的组件可以很好地处理除 RTF 之外的所有内容。我怎样才能追加 RTF 格式数据而不吹走祖先已经放置在那里的数据 class?如果有办法的话,我试图避免将我的副本中祖先的剪贴板逻辑复制到剪贴板例程。

您可以通过执行以下操作附加到现有剪贴板数据:

  1. 呼叫Clipboard.Open.
  2. 调用将其他数据放入剪贴板的基本 class 方法。
  3. 致电 Clipboard.SetAsHandle,或 SetClipboardData 传递您的 RTF。
  4. 呼叫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;

因为我们一直锁定剪贴板,所以没有其他进程可以阻止我们。基本组件方法将在开始添加文本之前清空剪贴板。