使用C#确定当前的打印作业颜色

在来到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(); 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(); 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 } 

}

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

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

我花了很多时间来权衡如何获得定义的彩色打印的真正价值,并发现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; }