我正在使用 Windows 服务,我想在服务启动时打印一个 .html 页面。我正在使用这段代码并且打印效果很好。但是出现了打印对话框,没有打印对话框怎么打印呢?
public void printdoc(string document)
{
Process printjob = new Process();
printjob.StartInfo.FileName = document;
printjob.StartInfo.UseShellExecute = true;
printjob.StartInfo.Verb = "print";
printjob.StartInfo.CreateNoWindow = true;
printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
printjob.Start();
}
有没有其他方法可以在不显示打印对话框的情况下打印它。
更新:回应this :
但是我已经使用过这个类但是当我调用
axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);
当我从窗口服务使用时,我的程序在此处被阻止,但它在 Windows 应用程序中运行良好。
最佳答案
首先,这是代码:
using System.Reflection;
using System.Threading;
using SHDocVw;
namespace HTMLPrinting
{
public class HTMLPrinter
{
private bool documentLoaded;
private bool documentPrinted;
private void ie_DocumentComplete(object pDisp, ref object URL)
{
documentLoaded = true;
}
private void ie_PrintTemplateTeardown(object pDisp)
{
documentPrinted = true;
}
public void Print(string htmlFilename)
{
documentLoaded = false;
documentPrinted = false;
InternetExplorer ie = new InternetExplorerClass();
ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);
object missing = Missing.Value;
ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
Thread.Sleep(100);
ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
while (!documentPrinted)
Thread.Sleep(100);
ie.DocumentComplete -= ie_DocumentComplete;
ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
ie.Quit();
}
}
}
- 您可以通过添加对“Microsoft Internet Controls”的引用来访问 SHDocVw 命名空间,该引用位于“添加引用”对话框的 COM 选项卡上。
- 有关 InternetExplorer 对象的更多信息,请访问 MSDN。 .
- Navigate() 方法将加载 HTML 文件。其他参数允许您指定可选参数,例如标志和 header 。
- 在加载文档之前我们无法打印。在这里,我进入了一个循环,等待调用 DocumentComplete 事件,此时会设置一个标志,通知我们导航已完成。请注意,只要导航完成 - 成功或失败,就会调用 DocumentComplete。
- 设置 documentLoaded 标志后,将通过 QueryStatusWB() 查询打印状态,直到启用打印。
- 打印是从 ExecWB() 调用开始的。指定了
OLECMDID_PRINT
命令以及选项OLECMDEXECOPT_DONTPROMPTUSER
以自动打印而无需用户交互。重要的一点是,这将打印到默认打印机。要指定打印机,您必须设置默认打印机(在代码中,您可以调用 SetDefaultPrinter() )。最后两个参数允许可选的输入和输出参数。 - 我们不想在打印完成之前退出,所以再次进入循环。触发 PrintTemplateTeardown 事件后,将设置 documentPrinted 标志。然后可以清理对象。
关于c# - 在没有打印对话框的情况下从 Windows 服务打印 html 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419412/