在Delphi中从剪贴板读取HTML内容

use*_*073 2 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');
Run Code Online (Sandbox Code Playgroud)

那我的常规是

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;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 5

The HTML format is documented here. It is placed on the clipboard as UTF-8 encoded text, and you can extract it like this.

{$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.
Run Code Online (Sandbox Code Playgroud)