如何通过Printername和JobID暂停Win32_printJob [英] How to pause the Win32_printJob by Printername and JobID
问题描述
任务
当用户打印文档时,将暂停弹出窗口,然后填写表格并单击Enter
我们有 50台网络打印机, 2000客户端计算机和一台打印服务器。
每个客户都有 3或4台打印机
问题
如果用户在本地打印文档(EX:PDF打印机,XPS文档写入器)(或)使用网络打印机(CANON,HP),打印作业立即暂停。
我的经历
当打印任何文档时,事件监听器将监视并返回打印作业。
-
在 First Pause Method 中有时有效,大多数时候不起作用道具erly。因为它正在搜索打印作业,但尚未搜索到。
-
在第二个暂停方法中不起作用因为,事件侦听器返回Managementbaseobject,但是如果要暂停打印作业,则需要ManagementObject 如何将ManageBaseObject转换为ManageObject
PRINTJOB事件主持人代码
managementEvent =新的ManagementEventWatcher();
managementEvent.Query = new EventQuery( SELECT * FROM __InstanceCreationEvent WITHIN 0.1 WHERE TargetInstance ISA'Win32_PrintJob');
managementEvent.Scope = new ManagementScope(@ \root\cimv2);
managementEvent.EventArrived + =新的EventArrivedEventHandler(printJobArrived_EventArrived);
managementEvent.Start();
主要动作代码
私有无效printJobArrived_EventArrived(对象发送者,EventArrivedEventArgs e)
{
try
{
CurrentprintJob =(ManagementBaseObject)e.NewEvent.Properties [ TargetInstance]。Value;
}
catch(例外){
}
}
暂停打印作业方法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(prntJobCollection中的Managementment prntJob)
{
prntJob.InvokeMethod( Pause,null);
isActionPerformed = true;
}
}
catch(异常例外)
{
new LogFile()。WriteErrorLog(ex.StackTrace,ex.Message);
}
return isActionPerformed;
}
暂停打印作业方法2
public bool PausePrintJob(ManagementObject currentPrintJob,bool makePause)
{
bool isActionPerformed =错误;
尝试
{
{
if(makePause == true&& currentPrintJob!= null)
{
currentPrintJob.InvokeMethod(暂停 , 空值);
isActionPerformed = true;
}
else if(makePause == true&& currentPrintJob!= null)
{
currentPrintJob.InvokeMethod( Resume,null);
isActionPerformed = false;
}
}
}
catch(例外)
{
new LogFile()。WriteErrorLog(ex.StackTrace,ex。信息);
}
return isActionPerformed;
}
WMI对此太慢。您可能需要使用 FindFirstPrinterChangeNotification 和 FindNextPrinterChangeNotification 。
TASK
When user print the document ,pause the pop will appear then fill the form click enter the form will closed and job has been resumed.
We have 50 Network Printers , 2000 Client Machine and one print server.
EACH CLIENT had 3 or 4 printers
PROBLEM
If user print the document locally (EX:PDF PRINTER, XPS DOCUMENT WRITER) (or) using network printer (CANON,HP) the print-job was immediately PAUSE.
MY TRIES
When print any of the document the event listener watching and return the print job.
In First Pause Method sometimes work and mostof time doesn't work properly.Because, Its searching for the printjob but its not there is already printed.
In Second Pause Method doesn't work Because,event listener return the Managementbaseobject but If want to pause the Print Job need ManagementObject How to convert ManageBaseObject to 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();
MAIN ACTION CODE
private void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e)
{
try
{
CurrentprintJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
}
catch(Exception ex){
}
}
TO PAUSE THE PRINTJOB METHOD 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;
}
TO PAUSE THE PRINTJOB METHOD 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 is too slow for this. You probably need to use FindFirstPrinterChangeNotification and FindNextPrinterChangeNotification.
You might find these examples useful.
这篇关于如何通过Printername和JobID暂停Win32_printJob的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!