【问题标题】:Determine current print job color using C#使用 C# 确定当前打印作业的颜色
【发布时间】:2013-03-16 20:28:26
【问题描述】:

在来 SO 寻求答案之前,我在过去的 2 或 3 天都在 Google 上尝试了不同的问题形式以尝试使其发挥作用。

我需要获取当前打印作业的颜色设置,以确定用户执行了多少彩色或灰度打印。但是,我尝试访问的每个颜色属性(通过 ManagementObjectSearcher、“”Watcher 和 C# 的内置打印机类)总是返回颜色,而不是灰度。

任何帮助将不胜感激,因为我已经停止在解决方案方面取得进展。谢谢。下面是我的代码(请记住,这是我的原型代码,所以除了我要问的问题之外,可能还有很多问题。请仅在回答我的问题时提供建议)。

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Printing;
using System.Management;
using System.Management.Instrumentation;
using System.Threading;
using System.Windows.Threading;

using System.Diagnostics;

namespace PrintPlus {
    public partial class PrintPlus : Form {

    #region Objects
    // Mgmt 
    ManagementEventWatcher watcher;
    ManagementObjectSearcher searcher;

    // Thread
    Thread jobCheck;

    // Printer Objects
    PrintQueue printQ;
    PrintJobInfoCollection printJobCollection;

    // Timer
    private System.Windows.Forms.Timer timeLogged;

    #endregion

    #region Paths And Names

    string localMachineName;

    #endregion

    #region Costs

    private decimal timeCost;
    private decimal printCost;

    #endregion

    #region Print Variables

    private int color;

    private bool jobIsProcessing;

    private int numberOfPrints;
    private int colorPrints;
    private int greyScalePrints;

    private int printJobCount;

    #endregion

    #region Time Variables

    private float tSecs;
    private float tMins;
    private float tHrs;

    #endregion

    #region Constructor

    public PrintPlus() {
        InitializeComponent();
        initObjects();

        /* searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PrintJob");

        watcher = new ManagementEventWatcher("SELECT * FROM  __InstanceCreationEvent WITHIN 0.01 WHERE TargetInstance ISA \"Win32_PrintJob\"");
        watcher.EventArrived += new EventArrivedEventHandler(getColorSetting);
        watcher.Start();

        localMachineName = Environment.MachineName;*/
    }

    #endregion

    #region Initializers

    private void initObjects() {
        initPrinterObjects();
        initTimer();
    }

    private void initPrinterObjects() {
        LocalPrintServer lps = new LocalPrintServer();
        printQ = new PrintQueue(lps, lps.DefaultPrintQueue.Name);
    }

    private void initTimer() {
        timeLogged = new System.Windows.Forms.Timer();
        timeLogged.Interval = 1000;
        timeLogged.Tick += new EventHandler(onTick);
        timeLogged.Start();
    }

    #endregion

    #region Delegates

    private void onTick(object sender, EventArgs e) {
        updateTime();
        updateInfo();
    }

    private void onMove(object sender, EventArgs e) {
        this.Location = initialPosition;
    }

    private void onLoseFocus(object sender, EventArgs e) {
        this.MinimizeBox = true;
    }

    #endregion

    #region Updates

    private void updateInfo() {
        printJobCount = printQ.GetPrintJobInfoCollection().Count<PrintSystemJobInfo>();

        if (printJobCount >= 1 && !jobIsProcessing) {
            jobIsProcessing = true;
            jobCheck = new Thread(new ThreadStart(processJobs));
            jobCheck.Start();
        }

        numberOfPrints = (colorPrints + greyScalePrints);

        timeCostLbl.Text = "Time: $" + timeCost.ToString();
        printCostLbl.Text = "Print: $" + printCost.ToString();
        totalCostLbl.Text = "Total: $" + (timeCost + printCost).ToString();
        printedPagesLbl.Text = "Printed Pages: " + numberOfPrints.ToString() + " Colour: " + colorPrints.ToString() + " B&W: " + greyScalePrints.ToString();
   }

    private void updateTime() {
        tSecs += timeLogged.Interval / 1000;

        if (tSecs == 60) {
            timeCost += FEES.COST_PER_MIN;
            tMins += 1;
            if (tMins == 60) {
                tHrs += 1;
            }
            tSecs = 0;
        }
        int i = 0;

        String hrs = ((tHrs >= 10) ? tHrs.ToString() : i + tHrs.ToString());
        String mins = ((tMins >= 10) ? tMins.ToString() : i + tMins.ToString());
        String secs = ((tSecs >= 10) ? tSecs.ToString() : i + tSecs.ToString());

        this.timeElapsedLbl.Text = "Time Logged: " + hrs + " : " + mins + " : " + secs;
    }

    public void processJobs() {
        LocalPrintServer lps = new LocalPrintServer();
        PrintQueue printQ = new PrintQueue(lps, lps.DefaultPrintQueue.Name);
        PrintJobInfoCollection printJobCollection = printQ.GetPrintJobInfoCollection();
        PrintSystemJobInfo[] jobArray = printJobCollection.ToArray<PrintSystemJobInfo>();

        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PrintJob");
        ManagementObjectCollection searchCollection = searcher.Get();

        foreach (ManagementObject job in searchCollection) {
            foreach (PropertyData prop in job.Properties) {
                Debug.WriteLine(prop.Name + ": " + prop.Value);
            }
        }

        try {
            for (int i = 0; i < jobArray.Length; ++i) {
                if (jobArray[i].PositionInPrintQueue == 1) {
                    while (jobArray[i].JobStatus != PrintJobStatus.Deleted) {
                        jobArray[i].Refresh();
                    }
                }

                Debug.WriteLine(printQ.CurrentJobSettings.CurrentPrintTicket.OutputColor.Value);

                /*if (jobArray[i].PropertiesCollection. == "Color") {
                    colorPrints += jobArray[i].NumberOfPagesPrinted;
                }
                else if (jobArray[i].PropertiesCollection["Color"].ToString() == "Monochrome") {
                    greyScalePrints += jobArray[i].NumberOfPagesPrinted;
                }*/
            }
        }
        finally {
            jobIsProcessing = false;
            lps.Dispose();
            printQ.Dispose();
            printJobCollection.Dispose();
            jobCheck.Abort();
        }
    }

    private void getPrintWatcher(int jobID) {

    }

    private void getColorSetting(object sender, EventArrivedEventArgs e) {
       /* foreach (PropertyData data in e.NewEvent.Properties) {
            ManagementBaseObject mbo = data.Value as ManagementBaseObject;

            if (mbo.Properties["Color"].Value == "Color") {
                color = COLOR_VALUES.COLOR;
            }
            else if (mbo.Properties["Color"].Value == "Monochrome") {
                color = COLOR_VALUES.MONO;
            }
        }*/
    }

    #endregion
}

}

【问题讨论】:

    标签: c# printing colors


    【解决方案1】:

    我相信您遇到的问题是因为打印机能够进行彩色和黑白打印。当您通过彩色打印机打印黑色字母文本文档时,WIN32_PrintJob 仍然会说该文档是彩色文档,除非您通过本地计算机的“打印机首选项”对话框明确告诉打印机以黑白方式打印。

    【讨论】:

    • 感谢您的回复!我想它可能是这样的。当涉及到彩色/单色时,有什么方法可以确定打印页面的性质?
    • "...明确告诉打印机通过本地机器的“打印机首选项”对话框进行黑白打印。”
    • 我使用您的一些示例代码对此进行了测试,当我将打印机设置切换为使用“黑白”而不是“颜色”时,WIN32_PrintJob 颜色属性设置为单色。至于确定打印页面的性质,可能需要绕过 WIN API 并直接与打印机硬件通信。
    • 嗨,大卫,感谢您的再次回复。我已经去测试了你所做的,它仍然为我注册为颜色,只有灰度和黑色墨水。这是一个显示我的意思的 imgur 链接:imgur.com/nK8nKhV 另外,您是否有任何好的资源来指导我与打印机正面对话?
    • 我不确定为什么颜色属性没有反映为单色。打印机驱动程序或 Windows 如何在内部与其通信可能有问题。
    【解决方案2】:

    每个打印机制造商和型号的颜色计数器工作方式不同。您最好的选择是在处理打印之前,检查打印材料并确定彩色页面和黑色页面。如果没有,您将不得不在仅适用于多功能打印机的机器计数器上进行中继,您可以通过 SNMP 获取此信息。

    【讨论】:

      【解决方案3】:

      我花了很多时间权衡如何获得定义的彩色打印的真正价值,发现Win32_PrintJob是这样提供这个信息的:

      public static bool PausePrintJob(string printerName, int printJobID)
      {
          bool isActionPerformed = false;
          string searchQuery = "SELECT * FROM Win32_PrintJob";
          ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery);
          ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
      
          foreach (ManagementObject prntJob in prntJobCollection)
          {
              System.String jobName = prntJob.Properties["Name"].Value.ToString();
      
              //Job name would be of the format [Printer name], [Job ID]
              char[] splitArr = new char[1];
              splitArr[0] = Convert.ToChar(",");
              string prnterName = jobName.Split(splitArr)[0];
              int prntJobID = Convert.ToInt32(jobName.Split(splitArr)[1]);
              string documentName = prntJob.Properties["Document"].Value.ToString();
      
              if (String.Compare(prnterName, printerName, true) == 0)
              {
                  if (prntJobID == printJobID)
                  {
                      // MessageBox.Show("PAGINAS : " + prntJob.Properties["TotalPages"].Value.ToString() + documentName + " " + prntJobID);
                      prntJob.InvokeMethod("Pause", null);
                      MessageBox.Show(prntJob.Properties["Color"].Value.ToString());
      
                      //prntJob.InvokeMethod("Resume", null);
                      isActionPerformed = true;
                      break;
                  }
              }
          }
          return isActionPerformed;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多