Есть ли способ получить информацию о Win32_Printjob, только когда она завершена после успешной печати? - PullRequest
0 голосов
/ 01 мая 2019

В настоящее время я улавливаю событие, когда пользователь печатает, но есть вся информация, но TotalPages не точен. В документе будет 28 страниц, но будет показано только 10, поскольку задание на печать все еще находится в процессе.

Я пытался зацикливаться в цикле while, но он всегда возвращал один и тот же результат. Попытка получить "Select * from Win32_PrintJob, где JobId = N"

private void StartWatcher()
        {
            try
            {
                txtBox.Text += "\r\nMonitoring for printer activity...";
                string wqlQuery = @"Select * From __InstanceCreationEvent Within 1
                    Where TargetInstance ISA 'Win32_PrintJob'";

                Classes.Printer.clsPrinter clsPrinter = new Classes.Printer.clsPrinter();
                WqlEventQuery query = new WqlEventQuery(wqlQuery);
                ManagementEventWatcher watcher = new ManagementEventWatcher(query);
                watcher.EventArrived += new EventArrivedEventHandler(printJobArrived_EventArrived);
                watcher.Start();
            }
            catch (Exception ex)
            {
                log.Error("Form1 StartWatcher: " + ex.Message.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e)
        {
            try
            {

                string note = "";


                ManagementBaseObject printJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
                note = "";
                note = "\r\n\r\nDescription :" + printJob.GetPropertyValue("Description").ToString();
                note += "\r\nTotal Pages:" + printJob.GetPropertyValue("TotalPages").ToString();
                //GetDetails(Convert.ToInt32(printJob.GetPropertyValue("JobId")));
                Upload(printJob.GetPropertyValue("TotalPages").ToString(), printJob.GetPropertyValue("Description").ToString());

                //foreach (PropertyData prop in printJob.Properties)
                //{
                //    string val = prop.Value == null ? "null" : prop.Value.ToString();
                //    note += "\r\n" + "\r\n" + prop.Name + ": " + val;
                //}

                txtBox.Invoke((Action)delegate
                {
                    txtBox.Text += note;
                });
            }
            catch (Exception ex)
            {
                log.Error("Form1 printJobArrived_EventArrived: " + ex.Message.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

Ожидаемый результат заключается в том, что он должен возвращать точное количество Totalpages, но возвращает неточные значения. Протестировано с печатью в pdf

1 Ответ

0 голосов
/ 02 мая 2019

Итак, после поиска я нашел ответ.Основная проблема заключалась в том, что запрос, вызвавший событие, изменился с

string wqlQuery = @"Select * From __InstanceCreationEvent Within 1
                Where TargetInstance ISA 'Win32_PrintJob'";

на

string wqlQuery = @"Select * From __InstanceModificationEvent  Within 0.1
                Where TargetInstance ISA 'Win32_PrintJob' And TargetInstance.JobStatus = 'Printing'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...