.NET: Как заставить элемент управления WebBrowser запускаться в IE, отображать HTML вне процесса?

я хочу создать элемент управления 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;
}

Примечание. Приведенный выше код отлично работает в нативных приложениях.

Я подумал, что перейду к делу и посмотрю, есть ли у кого-нибудь другие идеи, которые не связаны с единственным способом, которым я смог это понять.


Решение для взлома, использующее временный файл:

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;
}

person Ian Boyd    schedule 27.01.2009    source источник


Ответы (4)


Как я делал это раньше, это сохранить файл HTML на диск и передать имя файла в оболочку, например:

 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();

Отличительной особенностью этого является то, что он откроется в веб-браузере пользователя по умолчанию. Если вам нужен IE, то вам, вероятно, придется покопаться в реестре, найти его путь и выполнить его специально.

Вы также, вероятно, захотите избавиться от процесса, когда он будет завершен. Вы можете подписаться на событие Exited, которое сообщит вам, когда процесс можно будет удалить.

person Charlie Salts    schedule 28.01.2009
comment
Да, я пытаюсь найти .NET-эквивалент моего существующего функционального решения, для которого не требуется временный файл. - person Ian Boyd; 26.02.2009
comment
Я не уверен, какова ваша главная цель, но всегда есть вероятность, что ie.Navigate2() сможет перейти к файлу на веб-сервере. Итак, вы все еще обращаетесь к файлу, но он находится где-то еще. Опять же, я не уверен, что это поможет. Ваш браузер ДОЛЖЕН получить свой html откуда-то! - person Charlie Salts; 27.02.2009

Загрузите элемент управления WebBrowser с помощью HTML, как показано в примере ниже.
Возможно, это не отдельный процесс как таковой, но он выполняет свою работу. Дайте мне знать, действительно ли это должно быть в отдельном процессе, и я, возможно, смогу что-то подобное придумать. Которые включают, возможно, метод 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>
person BuddyJoe    schedule 27.01.2009
comment
Это не обязательно должен быть отдельный процесс, но он должен открываться внутри Internet Explorer. - person Ian Boyd; 26.02.2009

Я использую это для создания нового окна 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)

Я могу использовать это, чтобы раскрутить столько страниц, сколько нужно. Надеюсь это поможет.

person Leo Moore    schedule 29.01.2009
comment
За кнопкой. то есть нажмите кнопку, и появится новая страница, оставив исходную страницу открытой. - person Leo Moore; 04.02.2009
comment
я не могу найти какой-либо класс Page в .... ооо ... вы думаете, что я хочу сделать это из браузера. я хочу открыть браузер из управляемого кода (.NET) - person Ian Boyd; 26.02.2009

Элемент управления WebBrowser имеет свойство DocumentText. Если вы установите для него строку HTML, элемент управления отобразит правильный HTML на экране. Надеюсь это поможет!

person Community    schedule 25.04.2009