.NET:如何在IE中启动WebBrowser控件,显示HTML,进程外?

时间:2009-01-27 21:11:51

标签: .net internet-explorer

我想创建一个WebBrowser控件,给它显示HTML,然后让它在自己的Internet Explorer窗口中显示为进程外。

可以吗?


  • 是的,它必须不在流程中
  • 我已经有了一种涉及编写临时文件的技术。我想删除这个黑客​​解决方案

我还有另外三个关于stackoverflow运行的问题,所有这些问题都在使得以下代码工作的一小部分工作:

public static void SpawnIEWithSource(String szHtml)
{
   IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();

   object mv = System.Reflection.Missing.Value; //special "nothing" value
   object url = (String)@"about:blank";
   ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);

   mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;
   doc.Write(szHtml);
   doc.Close();

   ie.Visible = true;
}

注意:以上代码在原生应用中运行良好。

我以为我会切入追逐,看看是否有人有任何其他想法,这并不涉及我能够弄明白的唯一方法。


使用临时文件的hack解决方案是:

public static void SpawnIEWithSource(String szHtml)
{
   IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();

   object mv = System.Reflection.Missing.Value; //special "nothing" value
   object url = (String)@"about:blank";
   ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);

   //Todo: Figure out the .NET equivalent of the following
   //so that it doesn't have to write a temporary file
   //IDispatch webDocument = ie.Document;
   //webDocument.Write(szHtml);
   //webDocument.Close();

   String tempFilename = Path.GetTempFileName();
   try
   {
      //Rename to .htm, or else ie won't show it as actual HTML
      String htmlFile = Path.ChangeExtension(tempFilename, "htm");
      File.Move(tempFilename, htmlFile); //.NET's version of File.Rename
      tempFilename = htmlFile;

      //Write string to file
      StreamWriter writer = new StreamWriter(tempFilename);
      writer.Write(szHtml);
      writer.Close();

      url = (String)tempFilename;
      ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);

      //If we're going to delete the file, then we have to wait for IE to use it
      //else we delete it before it uses it
      while (ie.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
      {
         System.Threading.Thread.Sleep(10);
      }
   }
   finally
   {
      File.Delete(tempFilename);
   }

   //Make IE Visible
   ie.Visible = true;
}

4 个答案:

答案 0 :(得分:1)

之前我这样做的方法是将HTML文件保存到磁盘,并将文件名传递给shell,如下所示:

 System.Diagnostics.Process p = new System.Diagnostics.Process();
 p.StartInfo.FileName = "C:\Path\To\myHTMLFile.html";
 p.StartInfo.UseShellExecute = true;
 p.StartInfo.RedirectStandardOutput = false;
 p.StartInfo.Arguments = "";
 p.Start();

关于这一点的巧妙之处在于它将使用用户的默认Web浏览器打开。如果您需要IE,那么您可能需要深入了解注册表并获取其路径,并专门执行它。

你也可能想要在完成后处理该过程。您可以订阅一个名为Exited的事件,该事件将在您处理该流程时通知您。

答案 1 :(得分:0)

使用HTML加载WebBrowser控件,如下例所示 也许不是一个单独的过程本身,但完成工作。让我知道它是否真的需要在一个单独的过程中,我可能能够像这样工作。 其中涉及System.Diagnostics.Process.start()方法和一些JavaScript。

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title></title>
        </head>
        <body>
        <div id="holdingArea" style="display:none">
            <div>
            <strong>In a new page</strong>
            </div>
        </div>
        <script type="text/javascript">
            var h = document.getElementById('holdingArea').innerHTML;
            var w = window.open('', '_blank');
            w.document.write(h);
        </script>
        </body>
        </html>

答案 2 :(得分:0)

我使用它来创建一个带有独特随机句柄的新IE窗口,以便同时打开多个窗口。

 Dim WindowName As String = CStr(Rnd())
 WindowName = "W" & Replace(WindowName, ".", "0")
 Page.ClientScript.RegisterStartupScript(Me.GetType(), WindowName, WindowName & "=window.open('NominateList.aspx?Inviters=" & InviterList & "','" & WindowName & "','menubar=1,resizable=1,scrollbars=1,status=1,width=900,height=900');" & WindowName & ".moveTo(0,0);", True)

我可以根据需要使用它来旋转多个页面。希望这会有所帮助。

答案 3 :(得分:0)

WebBrowser控件具有 DocumentText 属性。如果将其设置为HTML字符串,则控件将在屏幕上呈现正确的HTML。 希望这有帮助!