【问题标题】:How can I see if text is selected in the browser and then retrieve it?如何查看是否在浏览器中选择了文本然后检索它?
【发布时间】:2025-11-26 21:40:01
【问题描述】:

我想知道 TChromiumFMX 浏览器组件是否包含用户选择的文本,如果是,则检索该文本,而无需用户先将其复制到剪贴板 (ctrl-c)。


改进 TLama 的回答: 如果您不使用 ShowMessage,则匿名过程不会总是在 Button1Click 退出之前完成,因此通常不会产生任何结果(或为时已晚)。因此,可以检查作为过程最后一行的 Done := true 是否已检索到该值:

procedure TForm1.Button1Click(Sender: TObject);
var Done: boolean;
begin
  Done := false;
  Chromium1.Browser.GetFocusedFrame.VisitDomProc(
    procedure(const document: ICefDomDocument)
    begin
      SelectedText := document.SelectionAsText;
      Done := true
    end
  );
  while not Done do Application.ProcessMessages
end;

【问题讨论】:

    标签: delphi chromium chromium-embedded tchromium


    【解决方案1】:

    您必须访问 DOM,作为礼物,您将收到对当前 ICefDomDocument 文档界面的引用。然后ICefDomDocument 接口提供SelectionAsText 方法,该方法将当前选择作为文本(如果有)返回。在代码中,您可以编写如下内容:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Chromium1.Browser.GetFocusedFrame.VisitDomProc(
        procedure(const document: ICefDomDocument)
        begin
          ShowMessage(document.SelectionAsText);
        end
      );
    end;
    

    【讨论】:

    • 哇,真快!奇迹般有效。谢谢!
    • 我已经更新了我的问题以包含答案,并进行了一些改进。随意将其从问题中删除并将其粘贴到答案中。
    • 在 Delphi 7 中是否有这样做,因为它没有匿名方法,我尝试用正常的过程替换它,但它似乎没有被调用。
    • @altazu,使用常规程序应该可以工作,我担心您是 DOM 访问无法访问的 DCEF(可能是 CEF,不确定)版本的受害者完全可以工作(这是我停止使用 DCEF 的主要原因)。我还没有深入研究问题的根源,所以我无法进一步帮助你。这是same problem 的一个问题(但我记得还有更多)。
    • 谢谢。看来我吃饱了你知道内置网络浏览器或铬的任何替代品吗?
    最近更新 更多