Как приостановить Win32_printJob с помощью Printername и JobID

ЗАДАЧА

Когда пользователь распечатает документ, появится пауза, а затем заполните форму, нажмите кнопку, введите форму, и работа будет возобновлена.

У нас есть 50 сетевых принтеров, 2000 клиентских компьютеров и один сервер печати.

У КАЖДОГО КЛИЕНТА было 3 или 4 принтера

ПРОБЛЕМА

Если пользователь печатает документ локально (например, PDF PRINTER, XPS DOCUMENT WRITER) (или) с помощью сетевого принтера (CANON,HP), задание на печать было немедленно приостановлено.

МОИ ПРОБЫ

При распечатке любого документа слушатель событий наблюдает и возвращает задание на печать.

  • В методе первой паузы иногда работают и большую часть времени не работает должным образом. Потому что, он ищет задание на печать, но его нет там уже напечатано.

  • Во втором методе паузы не работает, потому что слушатель события возвращает объект 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){

                       }
}

ПРИОСТАНОВИТЬ МЕТОД ПЕЧАТИ 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;
            }

ПРИОСТАНОВИТЬ МЕТОД ПЕЧАТИ 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;
        } 

1 ответ

WMI слишком медленный для этого. Возможно, вам нужно использовать FindFirstPrinterChangeNotification и FindNextPrinterChangeNotification.

Вы можете найти эти примеры полезными.

Наконец, я нашел решение на официальном веб-сайте документации MSDN для управления принтером, вот ссылка: https://www.codeproject.com/Articles/6592/A-Simple-Approach-for-Controlling-Print-Jobs-using

Это показывает, что как Pause, Resume а также Delete задание на печать. Основной класс Win32_PrintJob, Переменная printJob из ManagementObjectSearcher объект, который искал один экземпляр принтера.

printJob.InvokeMethod("Pause", null);
printJob.InvokeMethod("Resume", null);
printJob.Delete()

Я все еще обнаружил, что его реализация на Python кода: http://timgolden.me.uk/python/wmi/cookbook.html

import wmi
c = wmi.WMI ()

print_job_watcher = c.Win32_PrintJob.watch_for (
  notification_type="Creation",
  delay_secs=1
)

while 1:
  pj = print_job_watcher ()
  print "User %s has submitted %d pages to printer %s" % \
    (pj.Owner, pj.TotalPages, pj.Name)
Другие вопросы по тегам