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

时间:2017-08-23 10:39:22

标签: delphi clipboard delphi-10.1-berlin richtext

Embarcadero RAD Studio VCL采用TClipboard.HasFormat方法,例如Clipboard.HasFormat(CF_TEXT)Clipboard.HasFormat(CF_BITMAP)等。

但我没有找到任何受支持的CF_RTFCF_RICHTEXT格式描述符,它指示剪贴板中的富文本格式。

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

enter image description here

这列出了3种RichText格式,格式描述符 C078 C16B C1A5

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

1 个答案:

答案 0 :(得分:9)

  

我是否可以使用Clipboard.HasFormat($C078)来检测任何内容   剪贴板上的RichText格式?

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

  

注册新的剪贴板格式。然后可以将此格式用作a   有效的剪贴板格式。

     

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

var
  CF_RTF: UINT;
...
initialization
  CF_RTF := RegisterClipboardFormat('Rich Text Format');

然后检查:

if Clipboard.HasFormat(CF_RTF) then ...
{ or // if Windows.IsClipboardFormatAvailable(CF_RTF) then ... }

编辑:阅读文档后: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';

因此,对RegisterClipboardFormat的返回值使用其他命名可能更好一点。 e.g。

uses RichEdit;
...
var
  CF_RICHTEXT: UINT;
...
initialization
  CF_RICHTEXT := RegisterClipboardFormat(RichEdit.CF_RTF);

并且:

if Clipboard.HasFormat(CF_RICHTEXT) then ...

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