使用 TWebBrowser 时查看 Web 控制台

Posted

技术标签:

【中文标题】使用 TWebBrowser 时查看 Web 控制台【英文标题】:View Web Console When Using TWebBrowser 【发布时间】:2021-04-02 11:48:39 【问题描述】:

我正在使用TWebBrowser 来显示在 Vue 中创建的网页,但我目前无法调试页面功能在浏览器(IE 和 Chrome)中有效但无法从TWebBrowser。我正在寻找一种在显示TWebBrowser 时从 Delphi 中访问 Web 控制台或开发工具的方法,以便我可以确定究竟是什么阻止了页面功能的工作。

我尝试实现一个使用IDeveloperConsoleMessageReceiver 接口的TDeveloperConsoleMessageReceiver 类。初始化TWebBrowser 时创建此类。然后在TWebBrowserDocumentComplete我实现了以下功能:

procedure TTTWebBrowser.WebBrowserDocumentCompleted(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
var
   Target : IOleCommandTarget;
   Action : Cardinal;
   Params : OleVariant;
const
   IDM_ADDCONSOLEMESSAGERECEIVER = 3800;
   CGID_MShtml: TGUID = 'DE4BA900-59CA-11CF-9592-444553540000';
begin
   CallUserDocumentCompletedEvent(pDisp, URL);
   if Assigned(WebBrowser.Document) then begin
     Target := IOleCommandTarget(WebBrowser.Document);
     Action := IDM_ADDCONSOLEMESSAGERECEIVER;
     Params := EmptyParam;
     Target.Exec(@CGID_MSHTML, Action, OLECMDEXECOPT_DODEFAULT, IDeveloperConsoleMessageReceiver(DeveloperConsole), Params);
   end;
end;

其中DeveloperConsole 是在初始化时创建的DeveloperConsoleMessageReceiver 类。运行上述函数时,我在 Exec 上遇到访问冲突。

我将如何正确利用 DeveloperConsoleMessageReceiver 或者是否有其他方法可以在 Delphi 中调试 TWebBrowser

【问题讨论】:

不是答案,但通常 ActiveX 组件(Twebbrowser 是一个包装器)和 IE 之间的功能是相同的。一个警告是 TWebbrowser 在 IE7 模式下启动,导致大多数现代网页出现故障。您必须设置 FEATURE_BROWSER_EMULATION 标志才能更改此模式。更多信息可以在这里找到 别忘了旧的alert() 函数。 @Olivier:是的,但这只有在你控制了网页内容的情况下才有效。 默认情况下 TBwebBrowser 在 IE7 兼容模式下工作。为了使其在完整模式下运行,您需要选择加入浏览器仿真。你可以阅读如何做到这一点here。在此之后,webapges 应该在 TWebBroswer 中与在 Internet Explorer 中一样工作。 我确认浏览器处于 IE11 模式,并确保 FEATURE_BROWSER_EMULATION 注册表设置为 11000。IE 和 Delphi 浏览器的几乎所有功能都相同。警报、表格等显示得很好,但我正在尝试利用 here 找到的这个可拖动库,组件的实际拖动在 IE 中有效,但在 Delphi 浏览器中无效。 【参考方案1】:

我使用NavigateComplete2 事件并且它有效。 这是我的代码:

procedure TMainForm.WBNavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
const
  CGID_MSHTML: TGUID = 'DE4BA900-59CA-11CF-9592-444553540000';
  IDM_ADDCONSOLEMESSAGERECEIVER = 3800;
var
  vin, vout: OleVariant;
begin
  if FDebugConsole then // Call it only once
    Exit;
  vout := Null;
  vin := Self as IDeveloperConsoleMessageReceiver;
  (WB.Document as IOleCommandTarget).Exec(@CGID_MSHTML, IDM_ADDCONSOLEMESSAGERECEIVER, OLECMDEXECOPT_DODEFAULT
    ,vin, vout);
  FDebugConsole := True;
end;

您只需拨打IDM_ADDCONSOLEMESSAGERECEIVER 一次,之后您就可以导航到其他页面,并且控制台消息将继续到达。我的主窗体实现了IDeveloperConsoleMessageReceiver 接口。

【讨论】:

以上是关于使用 TWebBrowser 时查看 Web 控制台的主要内容,如果未能解决你的问题,请参考以下文章

TWebBrowser 中的方向键切换控件

Delphi 中TWebBrowser的扩展控件TExWebBrowser

在默认浏览器中打开 TWebBrowser 链接

如何禁用 TWebBrowser 上下文菜单?

如何在 TWebBrowser IDispatchEvent 中获取自定义事件参数

使用带有 TWebBrowser 的 IHTMLEventObj 处理程序的内存泄漏