C++:如何无焦点提取嵌入Edge浏览器组件的可见文本?
无需焦点提取嵌入EdgeBrowser文本的可行方案
方法一:通过WebView2内核执行JavaScript获取文本
你用的C++ Builder嵌入Edge组件本质是基于WebView2的,直接调用内核API执行JS脚本就能拿到文本,完全不需要窗口焦点,还能精准控制提取范围:
// 假设你的EdgeBrowser组件名为EdgeBrowser1 if (EdgeBrowser1->CoreWebView2 != nullptr) { // 这里用document.body.innerText获取整个页面可见文本,可替换成指定DOM选择器 EdgeBrowser1->CoreWebView2->ExecuteScriptAsync(L"document.body.innerText;", [](HRESULT result, PCWSTR scriptResult) { // scriptResult就是返回的文本内容,直接处理即可 UnicodeString extractedText = scriptResult; // 后续的文本处理逻辑 }); }
注意要等WebView2初始化完成后再调用(比如在组件的OnCreateWebView2Completed事件触发后),避免空指针问题。
方法二:直接访问DOM节点提取文本
如果组件封装了DOM访问接口,也可以直接操作页面文档对象来提取文本:
if (EdgeBrowser1->Document != nullptr) { MSHTML::IHTMLDocument2Ptr doc = EdgeBrowser1->Document; MSHTML::IHTMLElementPtr bodyElement = doc->body; UnicodeString extractedText = bodyElement->innerText; // 处理提取到的文本 }
这种方式同样不需要焦点,适合需要遍历特定DOM节点提取内容的场景。
额外提示
- 针对页面每分钟更新的情况,可以定时触发上述提取逻辑(比如用Timer组件),或者监听WebView2的
NavigationCompleted事件,在页面加载/更新完成后自动提取。 - 如果需要提取特定区域的文本,把JS里的
document.body.innerText换成对应的选择器即可,比如document.querySelector(".target-class").innerText。
内容的提问来源于stack exchange,提问作者Asger-P
相关产品推荐
相关产品推荐

