如何在C#中使用printDocument.print()取消最近的打印?

时间:2014-01-22 15:17:21

标签: c# printdocument

我有一个C#应用程序,可以使用printDocument Class正确打印简单文本。 问题是我想在调用新的.print()函数之前取消最近的打印作业或删除它们或清除打印队列! 我不知道我要做什么,似乎PrintDocument不会将打印作业推送到打印机队列!因为我在那里看不到任何工作。

感谢您帮助“清除使用printDocumnet.print()创建的最近打印作业” 阿里。

2 个答案:

答案 0 :(得分:1)

只要您拥有权利

,您就应该能够使用WMI

http://sandit27.wordpress.com/2008/05/12/how-to-cancel-printing-in-c/

答案 1 :(得分:1)

我曾经在打印机上做了很多工作,而且我通过PInvoke实现了我想要的大部分功能。

正如@Tsukasa的答案所说,你“可以”使用WMI,但如果你计划在你自己的机器以外的任何地方实际部署你的解决方案,这是另一个很难处理的噩梦。

正如我所提到的:我的建议是研究PInvoke。请记住,自从我在印刷行业工作以来已经使用了多年/ .NET Framework版本,因此Microsoft可能已经发布了一个原生于.NET的更优雅,易用的解决方案。

Here is a list of Print Spooler functions from the MSDN

基本上,如果你走这条路,你想要做的是:

  1. 在注册表中查找打印设备的命名句柄。这可以使用.NET框架中提供的注册表类来完成。 Windows打印机的名称将以“#”(或两个)开头,然后是一些乱码垃圾,然后是GUID。注册表中安装所有打印机的关键是:

    HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Print \ Printers

  2. 使用打印机名称调用OpenPrinter

  3. 使用从OpenPrinter检索到的句柄调用EnumJobs

  4. 调用SetJob传递从EnumJobs检索的作业ID,以取消您要取消的作业。请务必通过JOB_CONTROL_DELETE标志取消作业。

  5. 调用ClosePrinter,传递从OpenPrinter检索到的句柄。别忘了这一步。如果你这样做,Windows /打印后台处理程序会 非常 胡思乱想。

  6. 同样,我不能强调,最有可能是更好的,更多的.NET方式来做到这一点。我建议先把你的选择用尽。

    祝你好运。