如何通过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 。
您可能会发现这些 示例 很有用 。
- 如何为类型参数约束的generics类型编写扩展方法?
- System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient – 主要区别是什么?
- 匹配括号之间的整数
- 有没有`Task.Delay`的变体在实时通过后到期,例如即使系统被暂停和恢复?
- 如何在EntityFramework 4中保存子实体?
- 使用Simple Injector abd WebFormsMVP将运行时值传递给构造函数
- 通过TCP / .NET SSLStream发送文件很慢/不起作用
- NHibernate映射:将层次结构保存到单个表而不带鉴别器
- TypeDescriptor.GetConverter()不会返回我的转换器