【问题标题】:Spawn default browser with HTML string使用 HTML 字符串生成默认浏览器
【发布时间】:2021-12-12 04:19:42
【问题描述】:

我有代码(并且几十年来):

  • 给定一些 HTML string 在内存中
  • 将该文档交给 Internet Explorer 对象
  • 并使 Internet Explorer(独立进程)可见
  • 所有这些都不会在用户的计算机上乱扔临时文件

换句话说:

void SpawnIEWithSource(string szSourceHTML)
{
   IWebBrowser ie = (IWebBrowser)CoCreateInstance(CLASS_InternetExplorer, null, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
         UuidOf(IUnknown));

   ie.Navigate2("about:blank");
   ie.Document.Write(szSourceHtml);
   ie.Document.Close;
   ie.Visible = True;
}

但是 IE 正在消失

Microsoft recently announced 表示 Internet Explorer(产品)将不再随 Windows 提供,但 Internet Explorer(编程 api)将继续工作:

正如今天宣布的那样,具有 IE 模式的 Microsoft Edge 将正式取代 Windows 10 上的 Internet Explorer 11 桌面应用程序。因此,Internet Explorer 11 桌面应用程序将在 2022 年 6 月 15 日停止支持并停用Windows 10 版本。

在本公告发布时超出范围(不受影响):

  • Microsoft Edge 中的 Internet Explorer 模式
  • Internet Explorer 平台 (MSHTML/Trident),包括 WebOC
  • Internet Explorer 11 桌面应用程序在:
    • Windows 8.1
    • Windows 7 扩展安全更新 (ESU)
    • Windows 10 Server SAC(所有版本)
    • Windows 10 IoT 长期服务通道 (LTSC)(所有版本)
    • Windows 10 Server LTSC(所有版本)
    • Windows 10 客户端 LTSC(所有版本)

什么是 MSHTML (Trident) 引擎?这与 IE 模式有何关系?

MSHTML (Trident) 引擎是 Internet Explorer 11 的底层平台。这与 IE 模式使用的引擎相同,并将继续得到支持(换句话说,不受本公告的影响)。 WebOC 也将继续得到支持。 如果您有一个依赖 MSHTML 平台的自定义或第三方应用程序,您可以期待它继续工作。

(强调我的)

这意味着微软正在打破 23 年的向后兼容性 - 并将其替换为...什么都没有。

所以我需要找到一种方法来替换它。

  • 生成默认浏览器
  • 给它我要显示的 HTML
  • 全部没有临时文件

阅读奖励

【问题讨论】:

  • 写入 RAM 而不是文件系统是否可以接受?
  • @Spyre 可以接受;这基本上就是现在正在发生的事情。我考虑过创建一个 TCP 监听套接字来提供内容,但是一些公司机器阻止打开监听套接字。
  • 你能举一个例子szSourceHTML 使用你现有的代码吗?
  • @Spyre <HTML><BODY>Hello, world!</BODY></HTML>
  • @Spyre 以前使用 Internet Explorer 的优点是它是操作系统的保证部分——每个版本的 Windows 都有它。如果没有 IE,我什至不知道是否会安装旧版 Edge,甚至是新版 Edge——更不用说 Chrome、Firefox 或 Brave。 data:text/html 架构很好,因为它可以在任何支持它的浏览器中启动。

标签: html windows browser automation


【解决方案1】:

我会将 HTML 编码为 Base64 and make it a Data-URI。所有现代浏览器都能够处理这样的 URI。但是,如果您的 HTML 字符串太大,这将不起作用。

基本上是这样的:

string Base64Encode(string plainText) {
  var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
  return System.Convert.ToBase64String(plainTextBytes);
}

void SpawnBrowserWithSource(string szSourceHTML) {
  System.Diagnostics.Process.Start("data:text/html;base64," + Base64Encode(szSourceHTML));
}    

导致:

(代码 sn-ps 来自以下 Stackoverflow 答案:base64 encodingopening default browser

【讨论】:

  • 嗯,长度限制是个问题。它通常用于转储临时数据库报告 - html 表中的几十万行。
  • 根据this answer,Chrome 的限制似乎是 2MB,Firefox 没有限制,IE>9/Edge 有 4GB 的限制。所以 Chrome 是这里的限制因素。您的 HTML 是否大于 2MB?
  • 我想最好的选择是检查 IE 的存在(不管它消失后的样子),如果它不存在,则以 base64 编码启动它并希望它不会被切断.
  • 不幸的是,现实情况是32767 - MAX_PATH 中允许的最大值 - 这对于任何现实世界的场景来说都是非常不足的。
【解决方案2】:

如果您知道用户使用的是 Chrome 或 Edge,您可以将 WebBrowser 实例替换为 ChromiumWebBrowser,并使用 LoadHtml 方法注入内容。

相关链接:

web browser control in winform with google chrome c# https://www.telerik.com/support/kb/winforms/details/how-to-embed-chrome-browser-in-a-winforms-application https://cefsharp.github.io/api/51.0.0/html/T_CefSharp_WinForms_ChromiumWebBrowser.htm

【讨论】:

  • 我没有使用网络浏览器控件。我正在进程外启动 实际 浏览器。
  • 那你可以尝试插入 Chrome 或 Edge 的 GUID,而不是 CoCreateInstance 的 CLASS_InternetExplorer 参数,我不确定该 GUID 是否会有常量。
  • Edit:我不知道使用 CCreateInstance 时启动默认浏览器的好方法。您可以在 Chrome 上试试这个:{418DFFBFA-4DE8-41C0-A272-727307252DBD}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2023-03-25
  • 1970-01-01
  • 2020-05-05
  • 2014-08-10
相关资源
最近更新 更多