如何通过Printername和JobID暂停Win32_printJob

任务

当用户打印文档时,暂停弹出将出现然后填写表单单击输入表单将关闭并且作业已恢复。

我们有50台网络打印机2000台客户机一台打印服务器

每个客户有3或4台打印机

问题

如果用户使用网络打印机(CANON,HP)在本地打印文档(EX:PDF PRINTER,XPS DOCUMENT WRITER) (或) 则打印作业立即停止。

我的尝试

当打印任何文件时,事件监听器正在观看并返回打印作业

  • 第一暂停方法有时工作,大部分时间不能正常工作。因为,它搜索printjob,但它没有已经打印。

  • 第二个暂停方法不起作用因为,事件侦听器返回Managementbaseobject但是如果要暂停打印作业需要ManagementObject 如何将ManageBaseObject转换为ManageObject

PRINTJOB EVENT LISTENER CODE

managementEvent = new ManagementEventWatcher(); managementEvent.Query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.1 WHERE TargetInstance ISA 'Win32_PrintJob'"); managementEvent.Scope = new ManagementScope(@"\root\cimv2"); managementEvent.EventArrived += new EventArrivedEventHandler(printJobArrived_EventArrived); managementEvent.Start(); 

主要行动守则

 private void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e) { try { CurrentprintJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; } catch(Exception ex){ } } 

暂停PRINTJOB方法1

  public bool PausePrintJob(string jobname) { bool isActionPerformed = false; try { string searchQuery = "SELECT * FROM Win32_PrintJob WHERE Name LIKE '%"+jobname+"%'"; ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery); ManagementObjectCollection prntJobCollection = searchPrintJobs.Get(); foreach (ManagementObject prntJob in prntJobCollection) { prntJob.InvokeMethod("Pause", null); isActionPerformed = true; } } catch (Exception ex) { new LogFile().WriteErrorLog(ex.StackTrace, ex.Message); } return isActionPerformed; } 

暂停PRINTJOB方法2

  public bool PausePrintJob(ManagementObject currentPrintJob, bool makePause) { bool isActionPerformed = false; try { { if (makePause == true && currentPrintJob != null) { currentPrintJob.InvokeMethod("Pause", null); isActionPerformed = true; } else if (makePause == true && currentPrintJob != null) { currentPrintJob.InvokeMethod("Resume", null); isActionPerformed = false; } } } catch (Exception ex) { new LogFile().WriteErrorLog(ex.StackTrace, ex.Message); } return isActionPerformed; } 

WMI太慢了。 您可能需要使用FindFirstPrinterChangeNotification和FindNextPrinterChangeNotification 。

您可能会发现这些 示例 很有用 。