2

Я просматриваю различные WebBrowser control stackoverflow questions, и я не могу найти ответ на проблему, которую у меня есть. Я пытаюсь использовать WebBrowser control to print a web page. После MSDN's example, я создал следующий консольное приложение:WebBrowser Control - Консольное приложение - События не сжигаются

namespace WebPrintingMadness 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Text; 

    /// <summary> 
    /// The entry point of the program. 
    /// </summary> 
    class Program 
    { 
     /// <summary> 
     /// The main entry point of the program. 
     /// </summary> 
     /// <param name="args">Program arguments.</param> 
     [STAThread] 
     public static void Main(string[] args) 
     { 
      string url = "https://stackoverflow.com/"; 

      WebPagePrinter webPagePrinter = new WebPagePrinter(); 
      webPagePrinter.PrintWebPage(url); 
      Console.ReadLine(); 
     } 
    } 
} 



namespace WebPrintingMadness 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Windows.Forms; 

    /// <summary> 
    /// This class is used to print a web page. 
    /// </summary> 
    internal class WebPagePrinter : IDisposable 
    { 
     /// <summary> 
     /// A System.Windows.Forms.WebBrowser control. 
     /// </summary> 
     private WebBrowser webBrowser; 

     /// <summary> 
     /// Initializes a new instance of the WebPagePrinter class. 
     /// </summary> 
     internal WebPagePrinter() 
     { 
      this.webBrowser = new WebBrowser(); 
      this.webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(this.WebBrowser_DocumentCompleted); 
      this.webBrowser.ScriptErrorsSuppressed = true; 
     } 

     /// <summary> 
     /// Disposes of this instance. 
     /// </summary> 
     public void Dispose() 
     { 
      this.Dispose(true); 
      GC.SuppressFinalize(this); 
     } 

     /// <summary> 
     /// Prints a web page. 
     /// </summary> 
     /// <param name="url">The url of the web page.</param> 
     internal void PrintWebPage(string url) 
     { 
      this.webBrowser.Navigate(url); 
     } 

     /// <summary> 
     /// Disposes of this instance. 
     /// </summary> 
     /// <param name="disposing">True if disposing, otherwise false.</param> 
     protected virtual void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       if (this.webBrowser != null) 
       { 
        this.webBrowser.Dispose(); 
        this.webBrowser = null; 
       } 
      } 
     } 

     /// <summary> 
     /// Event handler for the webBrowser DocumentCompleted event. 
     /// </summary> 
     /// <param name="sender">The event sender.</param> 
     /// <param name="e">The event arguments.</param> 
     private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      WebBrowser navigated = sender as WebBrowser; 

      if (navigated == null) 
      { 
       return; 
      } 

      navigated.Print(); 
      navigated.Dispose(); 
     } 
    } 
} 

Однако событие DocumentCompleted никогда не стреляет. Можно ли использовать этот элемент управления Windows.Forms в консольном приложении?

+0

Похоже, что jachymko прав, поэтому я собираюсь преобразовать это в «бесшумное» приложение WinForms. –

ответ

1

Основным требованием резьбы STA является необходимость запуска насоса сообщений. В Windows Forms вы можете использовать Application.Run. Или вы можете написать сообщение насосом вручную, используя user32! GetMessage & DispatchMessage. Но, вероятно, проще использовать одно в WinForms или WPF.

+0

Можно ли ответить на мой вопрос here? – bitcycle

2

Он будет работать до тех пор, пока события процесса будут работать.

Вы можете просто вызвать «Application.DoEvents()» в цикле ожидания. Вам не нужно делать ничего более привлекательного, чем это, и он отлично работает в моем консольном приложении.