【问题标题】:Real number of TotalPages of a PrintJob (Win32_PrintJob)PrintJob 的实数 TotalPages (Win32_PrintJob)
【发布时间】:2017-10-02 20:32:59
【问题描述】:

每次ManagementEventWatcher发生变化时,我都会查询Win32_PrintJob WMI类,我获得了有关它的数据,例如:Document、HostPrintQueue、JobId、JobStatus、TotalPages等。但TotalPages并不代表实际要打印的页数,目前似乎要获取这些数据,打印作业还没有完成处理并在那个时刻转移要打印的页数,但实际总数是其他数字,如何获取打印作业完成后处理的实际数量? 这是我的代码:

 ManagementEventWatcher createPrintJobWatcher;
        String strComputerName = ".";
        // Create event query to be notified within 1 milli second of a change in a service
        WqlEventQuery createPrintJobQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.001 WHERE TargetInstance ISA \"Win32_PrintJob\"");

        createPrintJobWatcher = new ManagementEventWatcher();
        createPrintJobWatcher.Scope = new ManagementScope("\\\\" + strComputerName + "\\root\\CIMV2");
        createPrintJobWatcher.Query = createPrintJobQuery;
        // times out watcher.WaitForNextEvent in 1 seconds
        createPrintJobWatcher.Options.Timeout = new TimeSpan(0, 0, 1);
        //set the print event handler
        createPrintJobWatcher.EventArrived += new EventArrivedEventHandler(createPrintJobListener);

        createPrintJobWatcher.Start();

        Console.WriteLine("Listening...");

        Console.ReadLine();

createPrintJobListener 方法:

        static void createPrintJobListener(object sender, EventArrivedEventArgs e)
    {

        SelectQuery query = new SelectQuery("Win32_PrintJob");
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
        using (ManagementObjectCollection printJobs = searcher.Get())
            foreach (ManagementObject printJob in printJobs)
            {
                Console.WriteLine("c1:", printJob);
                Console.WriteLine("ID: {0}", printJob.GetPropertyValue("JobId").ToString());
                Console.WriteLine("name: {0}", printJob.GetPropertyValue("name").ToString());
                Console.WriteLine("status: {0}", printJob.GetPropertyValue("status").ToString());
                if (printJob.GetPropertyValue("JobStatus") != null)
                {
                    Console.WriteLine("JobStatus: {0}", printJob.GetPropertyValue("JobStatus").ToString());
                }
                else
                {
                    Console.WriteLine("JobStatus: NULLLLLL");
                }

                Console.WriteLine("PC: {0}", printJob.GetPropertyValue("HostPrintQueue").ToString());
                Console.WriteLine("TOTOAL PAGES: {0}", printJob.GetPropertyValue("TotalPages").ToString());                    
            }
    }

【问题讨论】:

    标签: c# winapi printing wmi print-job-control


    【解决方案1】:

    WMI 可能是not sufficient to do this

    Windows 不能可靠地提供页数(或副本等),因此获取准确信息的唯一方法是暂停作业并对其进行解析。这是一项不平凡的任务,但here's a little more info

    【讨论】:

    • 感谢您的回答。我已经找到了解决方案,问题是我在错误的时刻要求打印作业的总页数。当打印作业状态为“正在打印”时,是获取此值的时刻,至少这对我来说是这样的。现在的问题是,当我打印一个word文档时,风景中的dmCopies值总是显示1。顺便说一句,有一种方法可以用c#获取打印机的总历史计数?
    • Windows 不保留历史页数信息。如果你想玩SNMP,高端打印机就可以了。
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2015-08-11
    • 2018-12-28
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多