delphi - 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
解决方案
这实际上取决于复印机决定放置在剪贴板上的格式。它可以一次在剪贴板上放置多种格式。
带有 url 和可选文本的超链接可以使用以下任一方式表示:
包含链接 URL的 Shell
CFSTR_INETURL
格式(注册名称:),以及包含链接文本的格式(如果有)。'UniformResourceLocator'
CF_(UNICODE)TEXT
包含整个 HTML 片段的
CF_HTML
格式(注册名称'HTML Format'
:),包括<a>
超链接和可选的显示文本。
VCL 的TClipboard
类具有访问除格式以外的数据的方法HasFormat()
(可以使用属性检索)。GetAsHandle()
CF_(UNICODE)TEXT
TClipboard.AsText
您需要RegisterClipboardFormat()
在运行时使用 Win32 函数来获取CFSTR_INETURL
and的格式 ID CF_HTML
(使用上面提到的名称字符串),然后才能将这些 ID 与HasFormat()
and一起使用GetAsHandle()
。
TClipboard.FormatCount
您还可以使用和TClipboard.Formats[]
属性枚举剪贴板上当前可用的格式。对于$C000..$FFFF
范围内的格式 ID,请使用 Win32GetClipboardFormatName()
函数检索最初使用RegisterClipboardFormat()
.
推荐阅读
- java - 无法加载 io.micrometer.core.instrument.Timer$1
- r - 如何从图像中删除 tibble?
- security - Azure DevOps:拒绝向读者/项目有效用户查看“任务组”
- python - 更改等高线图上的颜色和标签的位置
- csv - 将 CSV 文件从 Google Drive 加载到 BigQuery 会产生零行且没有错误
- batch-file - 如何使用批处理文件脚本编辑 web.config 文件内容?
- php - 学说 - 数据包乱序
- keras - 加载 .hdf5 模型时出现问题(ValueError:未知层:FixedBatchNormalization)
- java - CVE-2018-2783 - 可以澄清一下这里的 CVE 是什么意思吗?
- ios - 在 Cordova 中,如何添加要在 Swift 而不是 Objective C 中构建的 iOS 平台?