Как читать настройки дуплекса и страниц на листе из текущего задания печати
Привет.
Моя задача-перехватить все печатные задания. Для каждого задания я хочу определить, была ли использована функция duplex или X pages per sheet.
Я пытаюсь решить это решение с помощью C# и .net Framework.
Я уже нашел несколько решений, чтобы получить более общую информацию о printjob (id, количество страниц, пользователь, цвет,...) с помощью WMI и системы.Пространство имен печати. Но я не мог получить информацию о дуплексе или PagerPerSheet jet.
Мой самый многообещающий подход заключался в следующем (см. Также прилагаемый пример кода):
- Прикрепить к событию создания WMI для Printjobs, чтобы получить уведомление
- Чтение jobid из свойств события
- использование системы.Пространство печати для получения заданий от конкретной очереди печати
- Приостановите printjob и попробуйте использовать его свойства
Я уже думал, что проблема решена, когда обнаружил класс PrintTicket (ReachFramework), прикрепленный к PrintQueue, который предлагает свойства “Duplexing” и “PagesPerSheet”.
К сожалению, мне пришлось обнаружить, что эти свойства – вопреки моим ожиданиям – не отражают состояние задания печати, которое я представил.
Я неправильно понимаю функциональность PrintQueue.CurrentJobSettings или я использую его неправильно?
Я пытался понять это в течение нескольких дней, но начал вращаться по кругу.
Если бы кто-нибудь мог указать на мою ошибку или предложить какое-то другое решение для перехвата этой информации, я был бы очень признателен.
Заранее спасибо,
Ганс-Петер
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Management; using System.Printing; using System.Threading; namespace PrintJobInterceptor { //paste this into an console application //please add references to ReachFramework, System.Management and System.Printing class Program { static void Main(string[] args) { // Initialize an event watcher and subscribe to events ManagementEventWatcher watcher = new ManagementEventWatcher(); string machineName = System.Environment.MachineName; string scopeName = String.Format(@"\\{0}\root\CIMV2", machineName); watcher.Scope = new ManagementScope(scopeName); // attach to creation events of printjobs string oQuery = "SELECT * FROM __InstanceCreationEvent WITHIN 0.01 WHERE TargetInstance ISA \"Win32_PrintJob\""; watcher.Query = new EventQuery(oQuery); watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); watcher.Start(); Console.ReadLine(); } static void watcher_EventArrived(object sender, EventArrivedEventArgs e) { //some information about printjob can be found in event args PrintEventInfo(e); int id = GetPrintJobId(e); LocalPrintServer s = new LocalPrintServer(); //XPS printer hardcoded here. Pleade replace with your printer's name. PrintQueue q = s.GetPrintQueue("Microsoft XPS Document Writer"); PrintSystemJobInfo printJob = null; try { printJob = q.GetJob(id); //do not enter a breakpoint until the printjob was retrieved from queue. otherwise there will be an excheption in the GetJob method //if you don't pause the job, small jobs will be gone to fast. espacially while debugging. printJob.Pause(); //if you don't wait some time and update the info, not all information will be correct (e.g. total page count ,...) Thread.Sleep(1000); printJob.Refresh(); printJob.HostingPrintQueue.Refresh(); //when i take a look at the various printteckets (especially the current one), i would expect it to hold the correct settings Console.WriteLine("Pages Per Sheet: " + printJob.HostingPrintQueue.CurrentJobSettings.CurrentPrintTicket.PagesPerSheet); //i know xps is only capable of manual duplexing - you can try it with some other printer Console.WriteLine("Duplex: " + printJob.HostingPrintQueue.CurrentJobSettings.CurrentPrintTicket.Duplexing); Console.WriteLine("Copy Count: " + printJob.HostingPrintQueue.CurrentJobSettings.CurrentPrintTicket.CopyCount); //unfortunately most of the infos are allways null, although i specified them in the print dialog. } catch (Exception ex) { } finally { if (printJob != null) printJob.Resume(); } } static void PrintEventInfo(EventArrivedEventArgs e) { foreach (PropertyData data in e.NewEvent.Properties) { Console.WriteLine(); Console.WriteLine(); Console.WriteLine("e.NewEvent.Properties: " + data.Name + " # " + data.Value); if (data.Value is ManagementBaseObject) { foreach (PropertyData qualifier in ((ManagementBaseObject)data.Value).Properties) { Console.WriteLine("- " + qualifier.Name + " # " + qualifier.Value); } } else { int i = 0; } } } static int GetPrintJobId(EventArrivedEventArgs e) { uint jobId = (uint)((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value).Properties["JobId"].Value; int intId = (int)jobId; return intId; } } }