栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

不预览即打印WebBrowser,即单击打印

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

不预览即打印WebBrowser,即单击打印

我有一个示例控制台应用程序,该应用程序使用WinForms打印一组HTML文件

WebBrowser
。您
DoWorkAsync
实际上可以在WinForms应用程序中借用它的一部分来完成打印任务,而无需进行任何更改:

// by Noseratio - http://stackoverflow.com/users/1768303/noseratiousing System;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace ConsoleApplicationWebBrowser{    class Program    {        // Entry Point of the console app        static void Main(string[] args)        { try {     // download each page and dump the content     var task = MessageLoopWorker.Run(DoWorkAsync,         "http://www.example.com", "http://www.example.net", "http://www.example.org");     task.Wait();     Console.WriteLine("DoWorkAsync completed."); } catch (Exception ex) {     Console.WriteLine("DoWorkAsync failed: " + ex.Message); } Console.WriteLine("Press Enter to exit."); Console.ReadLine();        }        // navigate WebBrowser to the list of urls in a loop        static async Task<object> DoWorkAsync(object[] args)        { Console.WriteLine("Start working."); var wb = new WebBrowser(); wb.scriptErrorsSuppressed = true; if (wb.document == null && wb.ActiveXInstance == null)     throw new ApplicationException("Unable to initialize the underlying WebBrowserActiveX"); // get the underlying WebBrowser ActiveX object; // this pre depends on SHDocVw.dll COM interop assembly, // generate SHDocVw.dll: "tlbimp.exe ieframe.dll", // and add as a reference to the project var wbax = (SHDocVw.WebBrowser)wb.ActiveXInstance; TaskCompletionSource<bool> loadedTcs = null; WebBrowserdocumentCompletedEventHandler documentCompletedHandler = (s, e) =>     loadedTcs.TrySetResult(true); // turn event into awaitable task TaskCompletionSource<bool> printedTcs = null; SHDocVw.DWebBrowserEvents2_PrintTemplateTeardownEventHandler printTemplateTeardownHandler = (p) =>     printedTcs.TrySetResult(true); // turn event into awaitable task // navigate to each URL in the list foreach (var url in args) {     loadedTcs = new TaskCompletionSource<bool>();     wb.documentCompleted += documentCompletedHandler;     try     {         wb.Navigate(url.ToString());         // await for documentCompleted         await loadedTcs.Task;     }     finally     {         wb.documentCompleted -= documentCompletedHandler;     }     // the DOM is ready,      Console.WriteLine(url.ToString());     Console.WriteLine(wb.document.Body.OuterHtml);     // print the document     printedTcs = new TaskCompletionSource<bool>();     wbax.PrintTemplateTeardown += printTemplateTeardownHandler;     try     {         wb.Print();         // await for PrintTemplateTeardown - the end of printing         await printedTcs.Task;     }     finally     {         wbax.PrintTemplateTeardown -= printTemplateTeardownHandler;     }     Console.WriteLine(url.ToString() + " printed."); } wb.Dispose(); Console.WriteLine("End working."); return null;        }    }    // a helper class to start the message loop and execute an asynchronous task    public static class MessageLoopWorker    {        public static async Task<object> Run(Func<object[], Task<object>> worker, params object[] args)        { var tcs = new TaskCompletionSource<object>(); var thread = new Thread(() => {     EventHandler idleHandler = null;     idleHandler = async (s, e) =>     {         // handle Application.Idle just once         Application.Idle -= idleHandler;         // return to the message loop         await Task.Yield();         // and continue asynchronously         // propogate the result or exception         try         {  var result = await worker(args);  tcs.SetResult(result);         }         catch (Exception ex)         {  tcs.SetException(ex);         }         // signal to exit the message loop         // Application.Run will exit at this point         Application.ExitThread();     };     // handle Application.Idle just once     // to make sure we're inside the message loop     // and SynchronizationContext has been correctly installed     Application.Idle += idleHandler;     Application.Run(); }); // set STA model for the new thread thread.SetApartmentState(ApartmentState.STA); // start the thread and await for the task thread.Start(); try {     return await tcs.Task; } finally {     thread.Join(); }        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390679.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号