delphi - Delphi中从剪贴板读取HTML内容

标签 delphi clipboard clipboarddata

我有一个网页,上面有各种表格。这些表格是 Javascript 组件,而不仅仅是纯 HTML 表格。我需要用Delphi程序(Delphi 10.3)处理这个网页的文本(有点类似于屏幕抓取)。

我执行Ctrl-A/Ctrl-C来选择所有网页并将所有内容复制到剪贴板。如果我将其粘贴到程序中的 TMemo 组件中,我只能获取表格外的文本。如果我粘贴到 MS Word 中,我可以看到所有内容,包括表格内的文本。

我可以将其正确粘贴到 TAdvRichEditor(第 3 方)中,但这需要很长时间,而且我经常会耗尽内存。这让我相信我需要直接读取 HTML 剪贴板格式的剪贴板。

我设置了剪贴板 HTML 格式。当我检查剪贴板内容时,我得到的内容看起来像是所有汉字字符。

当内容是HTML时,如何读取剪贴板的内容?

在完美的世界中,我只想要文本,而不是 HTML 本身,但我可以稍后将其删除。这就是我现在正在做的事情...

初始化时..(其中CF_HTML是全局变量)

CF_HTML := RegisterClipboardFormat('HTML Format');

那么我的日常工作是...

function TMain.ClipboardAsHTML: String;
var
  Data: THandle;
  Ptr: PChar;
begin
  Result := '';
  with Clipboard do
  begin
    Open;
    try
      Data := GetAsHandle(CF_HTML);
      if Data <> 0 then
      begin
        Ptr := PChar(GlobalLock(Data));
        if Ptr <> nil then
        try
          Result := Ptr;
        finally
          GlobalUnlock(Data);
        end;
      end;
    finally
      Close;
    end;
  end;
end;

** 其他信息 - 当我从网页复制时...然后我可以使用名为 InsideClipBoard 的免费工具检查剪贴板缓冲区的内容。它显示剪贴板包含 1 个条目,有 5 种格式:CT_TEXTCF_OEMTEXTCF_UNICODETEXTCF_LOCALE“HTML 格式”(格式 ID 为 49409)。只有 'HTML Format' 包含我正在寻找的内容......这就是我尝试使用我所显示的代码访问的内容。

最佳答案

HTML 格式已记录 here 。它以 UTF-8 编码文本的形式放置在剪贴板上,您可以像这样提取它。

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  Winapi.Windows,
  Vcl.Clipbrd;

procedure Main;
var
  CF_HTML: Word;
  Data: THandle;
  Ptr: Pointer;
  Error: DWORD;
  Size: NativeUInt;
  utf8: UTF8String;
  Html: string;
begin
  CF_HTML := RegisterClipboardFormat('HTML Format');

  Clipboard.Open;
  try
    Data := Clipboard.GetAsHandle(CF_HTML);
    if Data=0 then begin
      Writeln('HTML data not found on clipboard');
      Exit;
    end;

    Ptr := GlobalLock(Data);
    if not Assigned(Ptr) then begin
      Error := GetLastError;
      Writeln('GlobalLock failed: ' + SysErrorMessage(Error));
      Exit;
    end;
    try
      Size := GlobalSize(Data);
      if Size=0 then begin
        Error := GetLastError;
        Writeln('GlobalSize failed: ' + SysErrorMessage(Error));
        Exit;
      end;

      SetString(utf8, PAnsiChar(Ptr), Size - 1);
      Html := string(utf8);
      Writeln(Html);
    finally
      GlobalUnlock(Data);
    end;
  finally
    Clipboard.Close;
  end;
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

关于delphi - Delphi中从剪贴板读取HTML内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58923804/

相关文章:

delphi - 关闭TAdoconnection后如何在组合框或dbgrid中维护数据库输出

android - Kotlin Android - 从 fragment 复制到剪贴板

javascript - 使用 FireFox 中的 Vaadin 按钮复制到剪贴板

javascript - 使用 document.execCommand ("paste"从剪贴板粘贴数据);在 Firefox 扩展中

excel - 将 Excel 数字复制到剪贴板时的小数精度

delphi - 使用继承的接口(interface)作为 TDictionary 中的键

delphi - 如何使用带有多个参数的while循环?

delphi - 排序的 TStringList 错误 - 排序列表上不允许进行操作

service - 剪贴板复制粘贴在 Windows Server 2008/Vista 64 位上的服务中不起作用

javascript - 使用 JavaScript 和 Google Chrome API 将剪贴板数据存储到变量中