如何创建自己的非系统剪贴板?

3 delphi clipboard

是否可能,如果是这样,您将如何实施自己的剪贴板?

通过这个我的意思是能够像Windows剪贴板那样复制和粘贴任何东西,但实际上没有干扰系统剪贴板.

为了更好地了解这是我尝试过的:

uses
  ClipBrd;

...

procedure TMainForm.actCopyExecute(Sender: TObject);
var
  MyClipboard: TClipboard;
begin
  MyClipboard := TClipboard.Create;
  try
    MyClipboard.AsText := 'Copy this text';
  finally
    MyClipboard.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这是因为它会将字符串"复制此文本"复制到剪贴板,但它会覆盖Windows剪贴板上的内容.

以上必须只创建一个Windows剪贴板的实例,而不是实际创建自己的.

请注意,自定义剪贴板可以保存任何数据而不仅仅是纯文本.它应该与Windows剪贴板一样工作,但不会干扰它(丢失它上面的任何内容).

怎么能实现这一目标?

谢谢.

Ken*_*ite 5

你的问题令人困惑; 你说你想在不影响系统剪贴板的情况下这样做,但是(从你自己的评论到你的问题)你似乎想要实现类似MS Office的东西Paste Special.

如果它是第一个,正如其他人所说,你不能使用TClipboard包装器那样做; 你必须实现自己的,并在应用程序之间传递信息将非常困难.

如果是第二个,可以使用Windows API RegisterClipboardFormat来定义自己的格式.

type
  TForm1=class(TForm)
    YourCustomFormat: Word;
    procedure FormCreate(Sender: TObject);
  end;

implementation

constructor TForm1.FormCreate(Sender: TObject);
begin
  YourCustomFormat := RegisterClipboardFormat('Your Custom Format Name');
end;
Run Code Online (Sandbox Code Playgroud)

要以自定义格式将信息放入剪贴板,您必须使用GlobalAllocGlobalLock分配和锁定全局内存块,将数据复制到该块中,使用GlobalUnlock解锁块,用于TClipboard.SetAsHandle将内存块传输到剪贴板.然后,您需要调用GlobalFree来释放内存块.

要以自定义格式检索内容,基本上会执行相同的操作,只需颠倒几个步骤即可.您像以前一样使用GlobalAlloc/GlobalLock,用于TClipboard.GetAsHandle检索剪贴板的内容,将其复制到本地变量,然后调用GlobalFree.

这是一个将自定义格式(在本例中为RTF文本)放入剪贴板的旧示例 - 它来自TeamB的 Peter Below博士的新闻组帖子.(代码和格式是来自原始帖子的;我没有对它进行测试,甚至没有对其进行编译.)从上面的更改内容的指示中反转过程以使其恢复,我将其留给您锻炼身体.:)

procedure TForm1.BtnSetRTFClick(Sender: TObject);
Const
  testtext: PChar = '{\rtf1\ansi\pard\plain 12{\ul 44444}}';
  testtext2: PChar = '{\rtf1\ansi'+
  '\deff4\deflang1033{\fonttbl{\f4\froman\fcharset0\fprq2 Times New Roman;}}'
                     +'\pard\plain 12{\ul 44444}}';
  flap: Boolean = False;
Var
  MemHandle: THandle;
  rtfstring: PChar;
begin
    If flap Then
      rtfstring := testtext2
    Else
      rtfstring := testtext;
    flap := not flap;
    MemHandle := GlobalAlloc( GHND or GMEM_SHARE, StrLen(rtfstring)+1 );
    If MemHandle <> 0 Then Begin
      try
        StrCopy( GlobalLock( MemHandle ), rtfstring );
        GlobalUnlock( MemHandle );
        With Clipboard Do Begin
          Open;
          try
            AsText := '1244444';
            SetAsHandle( CF_RTF, MemHandle );
          finally
            Close;
          end;
        End;
      Finally
        GlobalFree( MemHandle );
      End;
    End
    Else
      MessageDlg('Global Alloc failed!',
                 mtError, [mbOK], 0 );
end;
Run Code Online (Sandbox Code Playgroud)

  • +1 RegisterClipboardFormat看起来似乎是@Blobby的方法 (3认同)
  • 我遇到了自定义格式的问题,我没有在粘贴端看到它.这是因为我在拷贝中使用了"GlobalFree(MemHandle);"这一行,在我指向粘贴端的数据之前释放了我的句柄.仅复制文本等标准格式时可能不适用.有点具体,但也许这些信息将有助于一些人! (2认同)