首页 > 解决方案 > Delphi,粘贴到delphi应用程序时检索可见文本和隐藏超链接

问题描述

我怎样才能做到这一点?我一直在互联网上寻找一些线索,但失败了。例如,您可以单击浏览器中的链接并复制它,然后将其粘贴到 word doc 文档中。我使用带有一些字段的 tcxGrid 并希望将此链接粘贴到该字段中。该字段将向您显示文本,但如果您单击它,它将打开带有此链接的浏览器。我可以修复所有后面的部分,但我不知道如何从剪贴板中提取文本和链接。有谁知道该怎么做?

我找到了一篇旧文章,描述了如何做到这一点,但结果并不好。我得到的是中文文本而不是 HTML .. 见下面我的测试代码:

function TForm2.clipBoardAsHTML: string;
var
  CF_HTML: UINT;
  CFSTR_INETURL: UINT;
  URL: THandle;
  HTML: THandle;
  Ptr: PChar;
begin
  CF_HTML := RegisterClipboardFormat('HTML Format');
  CFSTR_INETURL := RegisterClipboardFormat('UniformResourceLocator');
  result := '';
  with Clipboard do
  begin
    Open;
    try
      HTML := GetAsHandle(CF_HTML);
      if HTML <> 0 then
      begin
        Ptr := PChar(GlobalLock(HTML));
        if Ptr <> nil then
        try
          Result := Ptr;
        finally
          GlobalUnlock(HTML);
        end;
      end;
    finally
      Close;
    end;
  end;
end;

数据如下:敖潩㩮⸱ര匊阻止玱呈䱍〺〰〰〰ㄲര䔊摮呈䱍〺〰〰㈰㐳ള匊匊阻止等等。

所以我的代码看起来有问题.. :(

从 Firefox 和 Excel 获取副本时,剪贴板中不存在推荐的格式 CFSTR_INETURL,因此我无法使用该格式获取任何数据。

====================================

最新测试 - 检索格式名称。

procedure TForm2.Button2Click(Sender: TObject);
var
  i: integer;
  s: string;
  szFmtBuf: array[0..350] of PWideChar;
  fn: string;
  fmt: integer;
begin
  Memo1.Clear;
  for i := 0 to clipBoard.FormatCount - 1 do
  begin
    fmt := clipBoard.Formats[i];
    getClipBoardFormatName(fmt,@szFmtBuf,sizeOf(szFmtBuf));
    fn := WideCharToString(@szFmtBuf);
    if fmt >= 49152 then
    Memo1.Lines.Add(fmt.ToString+ ' - '+fn);
  end;
end;

最后我让这段代码工作了:)但是我如何从剪贴板获取url的主要问题仍然没有解决。:( 如果我遍历所有找到的格式,我只会从它们那里得到垃圾。Firefox 的格式看起来:

49161 - DataObject
49451 - text/html
49348 - HTML Format
50225 - text/_moz_htmlcontext
50223 - text/_moz_htmlinfo
50222 - text/x-moz-url-priv
49171 - Ole Private Data

标签: delphihyperlinkclipboard

解决方案


这实际上取决于复印机决定放置在剪贴板上的格式。它可以一次在剪贴板上放置多种格式。

带有 url 和可选文本的超链接可以使用以下任一方式表示:

  • 包含链接 URL的 ShellCFSTR_INETURL格式(注册名称:),以及包含链接文本的格式(如果有)。'UniformResourceLocator'CF_(UNICODE)TEXT

  • 包含整个 HTML 片段的CF_HTML格式(注册名称'HTML Format':),包括<a>超链接和可选的显示文本。

VCL 的TClipboard类具有访问除格式以外的数据的方法HasFormat()(可以使用属性检索)。GetAsHandle()CF_(UNICODE)TEXTTClipboard.AsText

您需要RegisterClipboardFormat()在运行时使用 Win32 函数来获取CFSTR_INETURLand的格式 ID CF_HTML(使用上面提到的名称字符串),然后才能将这些 ID 与HasFormat()and一起使用GetAsHandle()

TClipboard.FormatCount您还可以使用和TClipboard.Formats[]属性枚举剪贴板上当前可用的格式。对于$C000..$FFFF范围内的格式 ID,请使用 Win32GetClipboardFormatName()函数检索最初使用RegisterClipboardFormat().


推荐阅读