如何通过Printername和JobID暂停Win32_printJob [英] How to pause the Win32_printJob by Printername and JobID

查看:360
本文介绍了如何通过Printername和JobID暂停Win32_printJob的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任务


当用户打印文档时,将暂停弹出窗口,然后填写表格并单击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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆