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_TEXT,CF_OEMTEXT,CF_UNICODETEXT,CF_LOCALE,和'HTML Format'(具有49409格式ID)。仅'HTML Format'包含我正在寻找的内容...。这就是我尝试使用显示的代码访问的内容。
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)