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

时间:2015-02-25 20:18:09

标签: delphi append delphi-xe2 clipboard

我需要以多种格式将数据放在剪贴板上,一种是RTF。我正在使用的组件处理除了RTF之外的所有内容。如何附加RTF格式数据而不会吹走祖先类已存在的数据?如果有办法,我试图避免从我的副本中的祖先复制剪贴板逻辑到剪贴板例程。

1 个答案:

答案 0 :(得分:4)

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

  1. 致电Clipboard.Open
  2. 调用将其他数据放在剪贴板上的基类方法。
  3. 致电Clipboard.SetAsHandle,或SetClipboardData通过您的RTF。
  4. 致电Clipboard.Close
  5. 只要继承的电话在您的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;
    

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