.NET: Как заставить WebBrowser управлять запуском в IE, отображать HTML, вне процесса? - PullRequest
3 голосов
/ 28 января 2009

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

Ответы [ 4 ]

1 голос
/ 28 января 2009

То, как я делал это раньше, это сохранить файл 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, которое сообщит вам, когда процесс может быть ликвидирован.

0 голосов
/ 25 апреля 2009

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

0 голосов
/ 29 января 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)

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

0 голосов
/ 28 января 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...