Как закрыть веб-браузер во время печати? - PullRequest
2 голосов
/ 12 ноября 2010

Я пишу приложение, которое распечатывает (визуализированную) страницу HTML на каждый принтер, установленный на компьютере, на котором запущено приложение.Я делаю это, создавая WebBrowser, вызывая print () и закрывая форму.Я делаю это для каждого принтера, установленного на этом компьютере.

Моя проблема заключается в том, что когда я вызываю попытку закрыть форму, страница не печатается.Любые идеи о том, как я могу сделать печать независимым фоновым процессом, чтобы я мог закрыть форму, пока она еще печатает?

Это код, который у меня сейчас есть в форме:

    public PrintForm()
    {
        InitializeComponent();

        string doc = "C:\\Path\\To\\file.htm";
        browser.Url = new Uri(doc);
    }

    private void PrintForm_Shown(object sender, EventArgs e)
    {
        Thread t = new Thread(browser.Print);
        t.IsBackground = false;
        t.Start();

        this.Close();
    }

У меня есть другой класс, который переключает каждый из установленных принтеров как принтер по умолчанию (единственный способ программно обойти диалог печати) и затем вызывает

Applicated.Run(new PrintForm());

Действительно довольно просто код.Просто возникли проблемы с этим.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

Да, это не может работать. Первое препятствие, с которым вы столкнетесь, заключается в том, что WebBrowser - это COM-компонент с многопоточным интерфейсом. Вызов его метода Print для потока фактически не работает, COM соблюдает требования компонента к потокам и маршализирует вызов потока, в котором он был создан, вашего потока пользовательского интерфейса.

Ваш код взрывается, потому что вызов Close () формы также удаляет все дочерние элементы управления. Включая веб-браузер. Вы можете удалить его из коллекции Control, чтобы этого не происходило, но вам все равно придется вызывать его метод Dispose () после завершения печати. ​​

Решить это технически невозможно, вам нужно создать поток STA, который качает цикл сообщений. Проверьте мой код в этой теме для подхода.

0 голосов
/ 12 ноября 2010

Вам нужно изменить Is Background = true на IsBackground = false

Когда IsBackGround имеет значение true, поток не может помешать завершению процесса.Когда все потоки переднего плана завершатся, процесс завершится независимо от состояния каких-либо фоновых потоков.Установив для IsBackground значение false, вы делаете поток печати способным поддерживать процесс после завершения потока основного / пользовательского интерфейса.

Поток пользовательского интерфейса завершится, но процесс (видимый на панели управления) будет работать до тех пор, пока поток печати(и все остальные потоки, где IsBackground = false) завершены.Процесс не завершится, пока не будут созданы все основные потоки (включая печать).

При редактировании:

Пример создания веб-браузера внутри потока печати.Скорее всего, вам даже не нужно создавать и закрывать форму окна, если вам не требуется ввод данных пользователем.

Thread t = new Thread (new ParameterizedThreadStart(PrintUrl));
t.IsBackground = false;
t.Start((object)@"http://www.stackoverflow.com");

static void PrintUrl(object url)
{
    WebBrowser browser = new WebBrowser();
    browser.Url = new Uri((string)url);
    browser.Print();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...