gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:43:49 25 4
gpt4 key购买 nike

是否可能,如果可以,您将如何实现自己的剪贴板?

我的意思是能够像 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;

它的工作原理是将字符串“复制此文本”复制到剪贴板,但它会覆盖 Windows 剪贴板上的任何内容。

上面必须只是创建 Windows 剪贴板的实例,而不是实际创建您自己的实例。

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

如何实现这一目标?

谢谢。

最佳答案

你的问题令人困惑;您说您想要在不影响系统剪贴板的情况下执行此操作,但是(从您自己的评论到您的问题)您似乎想要实现类似 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;

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

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

这是一个将自定义格式(在本例中为 RTF 文本)放入剪贴板的旧示例 - 它来自 newsgroup post作者:Peter Below 博士 TeamB 。 (代码和格式是来自原始帖子的;我没有测试它,甚至没有编译它。)从我上面关于更改内容的说明中应该可以清楚地看到逆向过程以将其恢复,我将其留给您练习。 :)

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;

关于delphi - 如何创建自己的非系统剪贴板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com