如何在剪贴板上可靠地检测RICHTEXT格式?

use*_*348 4 delphi clipboard richtext delphi-10.1-berlin

Embarcadero公司的RAD Studio VCL有TClipboard.HasFormat方法,有使用例如Clipboard.HasFormat(CF_TEXT)Clipboard.HasFormat(CF_BITMAP)等.

但我没有找到任何支持CF_RTFCF_RICHTEXT格式描述符,表明剪贴板中的富文本格式.

所以我在Microsoft WordPad中创建了一些格式化文本并将其复制到剪贴板.然后我用剪贴板间谍程序来检查剪贴板上的格式:

在此输入图像描述

这里列出了3种富文本格式的格式描述符C078,C16BC1A5.

这些格式描述符是普遍的还是依赖于单个系统或当前情况?即,我通常可以Clipboard.HasFormat($C078)用来检测剪贴板上的任何RichText格式吗?还是有另一种方法吗?

kob*_*bik 9

我通常可以Clipboard.HasFormat($C078)用来检测剪贴板上的任何RichText格式吗?

不,您需要通过RegisterClipboardFormat功能注册RTF剪贴板格式.返回值由系统生成,可能会有所不同.

注册新的剪贴板格式.然后,此格式可用作有效的剪贴板格式.

如果已存在具有指定名称的已注册格式,则不会注册新格式,并且返回值将标识现有格式.这使得多个应用程序可以使用相同的注册剪贴板格式复制和粘贴数据.

var
  CF_RTF: UINT;
...
initialization
  CF_RTF := RegisterClipboardFormat('Rich Text Format');
Run Code Online (Sandbox Code Playgroud)

然后检查:

if Clipboard.HasFormat(CF_RTF) then ...
{ or // if Windows.IsClipboardFormatAvailable(CF_RTF) then ... }
Run Code Online (Sandbox Code Playgroud)

编辑:阅读文档后: How to Use Rich Edit Clipboard Operations

该常量CF_RTF已在RichEdit单位中声明为:

CF_RTF                 = 'Rich Text Format';
CF_RTFNOOBJS           = 'Rich Text Format Without Objects'; 
CF_RETEXTOBJ           = 'RichEdit Text and Objects';
Run Code Online (Sandbox Code Playgroud)

因此,对于返回值使用其他命名可能是更好的主意RegisterClipboardFormat.例如

uses RichEdit;
...
var
  CF_RICHTEXT: UINT;
...
initialization
  CF_RICHTEXT := RegisterClipboardFormat(RichEdit.CF_RTF);
Run Code Online (Sandbox Code Playgroud)

和:

if Clipboard.HasFormat(CF_RICHTEXT) then ...
Run Code Online (Sandbox Code Playgroud)

注意:已经有一些保留的系统剪贴板格式,如CF_TEXT(= 1),CF_BITMAP(= 2)等......但"CF_RTF"或"CF_RICHTEXT"不是其中之一.它是RICHEDIT公共控件使用的自定义格式,并通过RegisterClipboardFormat已经提到的方式注册.