From 64f56d3972b747a5484e1d2aaf1215a356073ea0 Mon Sep 17 00:00:00 2001 From: peizhiyong <zhiyong.pei@broconcentric.com> Date: 星期二, 01 四月 2025 10:04:41 +0800 Subject: [PATCH] 1.增加获取打印机状态的示例 --- src/Bro.M141.Process/UI/UIPrinter.cs | 239 +++++++++++++++++++++++++++++++++++++++++++++++ src/Bro.M141.Process/UI/UIPrinter.Designer.cs | 50 +++++++-- 2 files changed, 276 insertions(+), 13 deletions(-) diff --git a/src/Bro.M141.Process/UI/UIPrinter.Designer.cs b/src/Bro.M141.Process/UI/UIPrinter.Designer.cs index 1c3b081..42ce610 100644 --- a/src/Bro.M141.Process/UI/UIPrinter.Designer.cs +++ b/src/Bro.M141.Process/UI/UIPrinter.Designer.cs @@ -32,13 +32,16 @@ button1 = new Button(); textBox1 = new TextBox(); label1 = new Label(); + button3 = new Button(); + textBox2 = new TextBox(); SuspendLayout(); // // button2 // - button2.Location = new Point(180, 90); + button2.Location = new Point(283, 127); + button2.Margin = new Padding(5, 4, 5, 4); button2.Name = "button2"; - button2.Size = new Size(108, 60); + button2.Size = new Size(170, 85); button2.TabIndex = 1; button2.Text = "棰勮"; button2.UseVisualStyleBackColor = true; @@ -46,9 +49,10 @@ // // button1 // - button1.Location = new Point(32, 90); + button1.Location = new Point(50, 127); + button1.Margin = new Padding(5, 4, 5, 4); button1.Name = "button1"; - button1.Size = new Size(108, 60); + button1.Size = new Size(170, 85); button1.TabIndex = 2; button1.Text = "鎵撳嵃"; button1.UseVisualStyleBackColor = true; @@ -56,31 +60,53 @@ // // textBox1 // - textBox1.Location = new Point(113, 35); + textBox1.Location = new Point(178, 49); + textBox1.Margin = new Padding(5, 4, 5, 4); textBox1.Name = "textBox1"; - textBox1.Size = new Size(175, 23); + textBox1.Size = new Size(273, 30); textBox1.TabIndex = 3; // // label1 // label1.AutoSize = true; - label1.Location = new Point(52, 38); + label1.Location = new Point(82, 54); + label1.Margin = new Padding(5, 0, 5, 0); label1.Name = "label1"; - label1.Size = new Size(56, 17); + label1.Size = new Size(82, 24); label1.TabIndex = 4; label1.Text = "鎵撳嵃鍐呭"; // + // button3 + // + button3.Location = new Point(50, 308); + button3.Name = "button3"; + button3.Size = new Size(127, 61); + button3.TabIndex = 5; + button3.Text = "鑾峰彇鐘舵��"; + button3.UseVisualStyleBackColor = true; + button3.Click += button3_Click; + // + // textBox2 + // + textBox2.Location = new Point(50, 376); + textBox2.Margin = new Padding(5, 4, 5, 4); + textBox2.Name = "textBox2"; + textBox2.Size = new Size(490, 30); + textBox2.TabIndex = 6; + // // UIPrinter // - AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleDimensions = new SizeF(11F, 24F); AutoScaleMode = AutoScaleMode.Font; + Controls.Add(textBox2); + Controls.Add(button3); Controls.Add(label1); Controls.Add(textBox1); Controls.Add(button1); Controls.Add(button2); - Margin = new Padding(2, 3, 2, 3); + Margin = new Padding(3, 4, 3, 4); Name = "UIPrinter"; - Size = new Size(356, 362); + Size = new Size(559, 511); ResumeLayout(false); PerformLayout(); } @@ -91,5 +117,7 @@ private Button button1; private TextBox textBox1; private Label label1; + private Button button3; + private TextBox textBox2; } } diff --git a/src/Bro.M141.Process/UI/UIPrinter.cs b/src/Bro.M141.Process/UI/UIPrinter.cs index e0aa2ab..2f877cb 100644 --- a/src/Bro.M141.Process/UI/UIPrinter.cs +++ b/src/Bro.M141.Process/UI/UIPrinter.cs @@ -9,12 +9,14 @@ using System.Drawing; using System.Drawing.Printing; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ZXing; using ZXing.Common; +//using System.Printing; namespace Bro.M141.Process { @@ -50,7 +52,7 @@ ttheigh = 160; message = str; - this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240 (300 dpi)"; + this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240S (300 dpi)"; this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", ttwith, ttheigh); this.printDocument1.PrintController = new System.Drawing.Printing.StandardPrintController(); @@ -125,12 +127,245 @@ return; } PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog(); - this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240 (300 dpi)"; + this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240S (300 dpi)"; this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", ttwith, ttheigh); this.printDocument1.PrintPage += new PrintPageEventHandler(this.printDocument_Print); printPreviewDialog1.Document = printDocument1; DialogResult res = printPreviewDialog1.ShowDialog(); printPreviewDialog1.Document.Dispose(); } + + #region + [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] + private static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault); + + + [DllImport("winspool.drv", SetLastError = true)] + private static extern bool ClosePrinter(IntPtr hPrinter); + + + [DllImport("winspool.drv", SetLastError = true)] + private static extern bool GetPrinter(IntPtr hPrinter, + int dwLevel, IntPtr pPrinter, int cbBuf, out int pcbNeeded); + + + [DllImport("winspool.drv", CharSet = CharSet.Auto)] + public static extern int EnumJobs(IntPtr hPrinter, int FirstJob, int NoJobs, int Level, IntPtr pInfo, int cdBuf, + out int pcbNeeded, out int pcReturned); + + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct PRINTER_INFO_2 + { + public string pServerName; + public string pPrinterName; + public string pShareName; + public string pPortName; + public string pDriverName; + public string pComment; + public string pLocation; + public IntPtr pDevMode; + public string pSepFile; + public string pPrintProcessor; + public string pDatatype; + public string pParameters; + public IntPtr pSecurityDescriptor; + public uint Attributes; + public uint Priority; + public uint DefaultPriority; + public uint StartTime; + public uint UntilTime; + public uint Status; + public uint cJobs; + public uint AveragePPM; + } + + /// <summary> + /// 榛樿鎵撳嵃鏈虹殑鍚嶇О + /// </summary> + //private static string printerName = new LocalPrintServer().DefaultPrintQueue.Name; + private static string printerName = "Honeywell PX240S (300 dpi)"; + + /// <summary> + /// 鑾峰彇鎵撳嵃鏈虹殑鐘舵�佺紪鐮�(鏂瑰紡1) + /// </summary> + /// <returns></returns> + public static int GetPrinterStatusCodeInt() + { + int intRet = -1; + IntPtr hPrinter; + + + if (OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) + { + int cbNeeded = 0; + bool bolRet = GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out cbNeeded); + if (cbNeeded > 0) + { + IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded); + bolRet = GetPrinter(hPrinter, 2, pAddr, cbNeeded, out cbNeeded); + if (bolRet) + { + PRINTER_INFO_2 Info2 = new PRINTER_INFO_2(); + + + Info2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2)); + + + intRet = System.Convert.ToInt32(Info2.Status); + } + Marshal.FreeHGlobal(pAddr); + } + ClosePrinter(hPrinter); + } + + + return intRet; + } + /// <summary> + /// 妫�鏌ユ墦鍗版満鏄惁鍙敤(鏂瑰紡1) + /// </summary> + /// <param name="intStatusCodeValue"></param> + /// <returns></returns> + public static bool CheckIsEnable(int intStatusCodeValue) + { + bool isEnable = false; + if (UIPrinter.GetTaskNumber() == 0) + { + return true; + } + if (intStatusCodeValue == 0x0008000 || intStatusCodeValue == 0x00000400 || intStatusCodeValue == 0x00004000) + { + return true; + } + return isEnable; + } + + + /// <summary> + /// 鑾峰彇鎵撳嵃鏈虹殑鐘舵�佷俊鎭�(鏂瑰紡1) + /// </summary> + /// <returns></returns> + public static string GetPrinterStatusMessage(int intStatusCodeValue) + { + string strRet = string.Empty; + switch (intStatusCodeValue) + { + case 0: + strRet = "鍑嗗灏辩华锛圧eady锛�"; + break; + case 0x00000200: + strRet = "蹇�(Busy锛�"; + break; + case 0x00400000: + strRet = "琚墦寮�锛圥rinter Door Open锛�"; + break; + case 0x00000002: + strRet = "閿欒(Printer Error锛�"; + break; + case 0x0008000: + strRet = "鍒濆鍖�(Initializing锛�"; + break; + case 0x00000100: + strRet = "姝e湪杈撳叆,杈撳嚭锛圛/O Active锛�"; + break; + case 0x00000020: + strRet = "鎵嬪伐閫佺焊锛圡anual Feed锛�"; + break; + case 0x00040000: + strRet = "鏃犲ⅷ绮夛紙No Toner锛�"; + break; + case 0x00001000: + strRet = "涓嶅彲鐢紙Not Available锛�"; + break; + case 0x00000080: + strRet = "鑴辨満锛圤ff Line锛�"; + break; + case 0x00200000: + strRet = "鍐呭瓨婧㈠嚭锛圤ut of Memory锛�"; + break; + case 0x00000800: + strRet = "杈撳嚭鍙e凡婊★紙Output Bin Full锛�"; + break; + case 0x00080000: + strRet = "褰撳墠椤垫棤娉曟墦鍗帮紙Page Punt锛�"; + break; + case 0x00000008: + strRet = "濉炵焊锛圥aper Jam锛�"; + break; + case 0x00000010: + strRet = "鎵撳嵃绾哥敤瀹岋紙Paper Out锛�"; + break; + case 0x00000040: + strRet = "绾稿紶闂锛圥age Problem锛�"; + break; + case 0x00000001: + strRet = "鏆傚仠锛圥aused锛�"; + break; + case 0x00000004: + strRet = "姝e湪鍒犻櫎锛圥ending Deletion锛�"; + break; + case 0x00000400: + strRet = "姝e湪鎵撳嵃锛圥rinting锛�"; + break; + case 0x00004000: + strRet = "姝e湪澶勭悊锛圥rocessing锛�"; + break; + case 0x00020000: + strRet = "澧ㄧ矇涓嶈冻锛圱oner Low锛�"; + break; + case 0x00100000: + strRet = "闇�瑕佺敤鎴峰共棰勶紙User Intervention锛�"; + break; + case 0x20000000: + strRet = "绛夊緟锛圵aiting锛�"; + break; + case 0x00010000: + strRet = "鐑満涓紙Warming Up锛�"; + break; + case 1048706: + strRet = "鑹插甫宸茬敤灏�"; + break; + default: + strRet = "鏈煡鐘舵�侊紙Unknown Status锛�"; + break; + } + return strRet; + } + + /// <summary> + /// 鑾峰彇鎵撳嵃鏈烘鍦ㄦ墦鍗扮殑浠诲姟鏁�(鏂瑰紡1) + /// </summary> + /// <returns></returns> + public static int GetTaskNumber() + { + IntPtr handle; + int FirstJob = 0; + int NumJobs = 127; + int pcbNeeded; + int pcReturned = -1; + OpenPrinter(printerName, out handle, IntPtr.Zero); + // get num bytes required, here we assume the maxt job for the printer quest is 128 (0..127) + EnumJobs(handle, FirstJob, NumJobs, 1, IntPtr.Zero, 0, out pcbNeeded, out pcReturned); + + // allocate unmanaged memory + IntPtr pData = Marshal.AllocHGlobal(pcbNeeded); + + // get structs + EnumJobs(handle, FirstJob, NumJobs, 1, pData, pcbNeeded, out pcbNeeded, out pcReturned); + + return pcReturned; + } + #endregion + + + private void button3_Click(object sender, EventArgs e) + { + int taskNum = GetTaskNumber(); + int statuscode = GetPrinterStatusCodeInt(); + string status = GetPrinterStatusMessage(statuscode); + //鍙湁鍦ㄦ墦鍗版満寮傚父鏃跺啀娆′笅鍙戞墦鍗颁换鍔″悗锛屾墠鑳借幏鍙栧埌鎵撳嵃鏈虹姸鎬併�傝繖鏄洜涓烘墦鍗版満椹卞姩绋嬪簭閫氬父鍙湪澶勭悊鎵撳嵃璇锋眰鏃舵洿鏂板叾鐘舵�佷俊鎭�傚鏋滄墦鍗版満娌℃湁鎺ユ敹鍒版柊鐨勬墦鍗颁换鍔★紝鍙兘鏃犳硶绔嬪嵆鍙嶆槧鍑虹湡瀹炵姸鎬併�� + textBox2.Text = "taskNum:" + taskNum+ ",statuscode:"+ statuscode+",status:"+status; + } } } -- Gitblit v1.8.0