From 044e5d0e1491ef25976cf3e25cf7fdf2baf6cb7d Mon Sep 17 00:00:00 2001
From: kingno <30263@KINGNO>
Date: 星期二, 01 四月 2025 17:27:22 +0800
Subject: [PATCH] 合并

---
 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 950a1d0..df1b2f1 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
 {
@@ -49,7 +51,7 @@
             ttheigh = 160;
             message = str;
 
-            this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240S (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();
@@ -124,12 +126,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