Управление WebBrowser - Консольное приложение - События не запускаются
Я просматривал различные вопросы WebBrowser об управлении стеком стека и не могу найти ответ на возникающую у меня проблему. Я пытаюсь использовать элемент управления WebBrowser для печати веб-страницы. Следуя примеру MSDN, я создал следующее консольное приложение:
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://stackru.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 в консольном приложении?
2 ответа
Основным требованием к потоку STA является то, что ему необходимо запустить насос сообщений. В Windows Forms вы можете использовать Application.Run. Или вы можете написать сообщение вручную, используя user32!GetMessage & DispatchMessage. Но, вероятно, проще использовать тот в WinForms или WPF.
Он будет работать до тех пор, пока обрабатывает события.
Вы можете просто вызвать Application.DoEvents() в цикле ожидания. Вам не нужно делать ничего более изумительного, и это прекрасно работает в моем консольном приложении.