从 Delphi 中的剪贴板读取 HTML 内容
Reading HTML content from Clipboard in Delphi
我有一个网页,上面有各种 table。这些 table 是 Javascript 组件,而不仅仅是纯粹的 HTML table。我需要用 Delphi 程序 (Delphi 10.3).
处理这个网页的文本(有点类似于屏幕抓取)
我按 Ctrl-A/Ctrl-C 到 select 所有网页并将所有内容复制到剪贴板.如果我将其粘贴到程序中的 TMemo
组件中,我只会得到 table 之外的文本。如果我粘贴到 MS Word 中,我可以看到所有内容,包括 table.
中的文本
我可以将其正确粘贴到 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_TEXT
、CF_OEMTEXT
、CF_UNICODETEXT
、CF_LOCALE
和 'HTML Format'
(格式 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.
我有一个网页,上面有各种 table。这些 table 是 Javascript 组件,而不仅仅是纯粹的 HTML table。我需要用 Delphi 程序 (Delphi 10.3).
处理这个网页的文本(有点类似于屏幕抓取)我按 Ctrl-A/Ctrl-C 到 select 所有网页并将所有内容复制到剪贴板.如果我将其粘贴到程序中的 TMemo
组件中,我只会得到 table 之外的文本。如果我粘贴到 MS Word 中,我可以看到所有内容,包括 table.
我可以将其正确粘贴到 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_TEXT
、CF_OEMTEXT
、CF_UNICODETEXT
、CF_LOCALE
和 'HTML Format'
(格式 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.