예제 #1
0
 public static extern bool OpenPrinter(string printer, out IntPtr handle, ref StructPrinterDefaults pDefault);
예제 #2
0
 public static extern bool OpenPrinter(string printer, out IntPtr handle, ref StructPrinterDefaults pDefault);
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <returns>
        /// 0:禁用;1:正常;2:忙;3:离线;
        /// 10:空闲未装载纸;11:空闲已装载纸,准备就绪
        /// </returns>
        public virtual int GetStatus()
        {
            log.Debug("begin");

            if (!enabled)
            {
                log.DebugFormat("end, return = {0}", StatusCode.Disabled);
                return(StatusCode.Disabled);
            }

            int    result = StatusCode.Offline;
            IntPtr hPrinter;
            StructPrinterDefaults defaults = new StructPrinterDefaults();

            if (!OpenPrinter(name, out hPrinter, ref defaults))
            {
                log.InfoFormat("end, return = {0}", StatusCode.Offline);
                return(StatusCode.Offline);
            }

            uint s        = 0x00001000;
            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)
                {
                    PrinterInfo2 Info2 = (PrinterInfo2)Marshal.PtrToStructure(pAddr, typeof(PrinterInfo2));
                    s = Info2.Status;
                }
                Marshal.FreeHGlobal(pAddr);
            }
            ClosePrinter(hPrinter);

            log.InfoFormat("s = {0}", s);

            if ((uint)PrinterStatus.PRINTER_STATUS_PAPER_OUT == (s & (uint)PrinterStatus.PRINTER_STATUS_PAPER_OUT) ||
                (uint)PrinterStatus.PRINTER_STATUS_DOOR_OPEN == (s & (uint)PrinterStatus.PRINTER_STATUS_DOOR_OPEN) ||
                ((uint)PrinterStatus.PRINTER_STATUS_PAPER_PROBLEM == (s & (uint)PrinterStatus.PRINTER_STATUS_PAPER_PROBLEM)))
            {
                result = 10;
            }
            else if ((uint)PrinterStatus.PRINTER_STATUS_PRINTING == (s & (uint)PrinterStatus.PRINTER_STATUS_PRINTING))
            {
                result = 2;
            }
            else if (0 == s)
            {
                result = 11;
            }
            else
            {
                result = 3;
            }

            log.InfoFormat("result = {0}", result);
            log.Debug("end");
            return(result);
        }