css_team Ответов: 1

Как читать настройки дуплекса и страниц на листе из текущего задания печати


Привет.

Моя задача-перехватить все печатные задания. Для каждого задания я хочу определить, была ли использована функция 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;
        }
    }
}

1 Ответов

Рейтинг:
2

Member 12579423

Вы когда-нибудь находили решение этой проблемы?


Dave Kreskowiak

Ты ведь понимаешь, что этот пост был написан семь лет назад, верно? Очень маловероятно, что вы когда-нибудь получите ответ от ОП.

Вы также опубликовали это как решение для поста.