首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#获取打印机状态,该如何解决

2012-06-11 
C#获取打印机状态C# codeclass CSCPrintClass{public static string GetPrinterStatus(string PrinterName

C#获取打印机状态

C# code
class CSCPrintClass    {        public static string GetPrinterStatus(string PrinterName)        {            int intValue = GetPrinterStatusInt(PrinterName);            string strRet = string.Empty;            switch (intValue)            {                case 0:                    strRet = "准备就绪(Ready)";                    break;                case 0x00000200:                    strRet = "忙(Busy)";                    break;                case 0x00400000:                    strRet = "被打开(Printer Door Open)";                    break;                case 0x00000002:                    strRet = "错误(Printer Error)";                    break;                case 0x0008000:                    strRet = "初始化(Initializing)";                    break;                case 0x00000100:                    strRet = "正在输入,输出(I/O Active)";                    break;                case 0x00000020:                    strRet = "手工送纸(Manual Feed)";                    break;                case 0x00040000:                    strRet = "无墨粉(No Toner)";                    break;                case 0x00001000:                    strRet = "不可用(Not Available)";                    break;                case 0x00000080:                    strRet = "脱机(Off Line)";                    break;                case 0x00200000:                    strRet = "内存溢出(Out of Memory)";                    break;                case 0x00000800:                    strRet = "输出口已满(Output Bin Full)";                    break;                case 0x00080000:                    strRet = "当前页无法打印(Page Punt)";                    break;                case 0x00000008:                    strRet = "塞纸(Paper Jam)";                    break;                case 0x00000010:                    strRet = "打印纸用完(Paper Out)";                    break;                case 0x00000040:                    strRet = "纸张问题(Page Problem)";                    break;                case 0x00000001:                    strRet = "暂停(Paused)";                    break;                case 0x00000004:                    strRet = "正在删除(Pending Deletion)";                    break;                case 0x00000400:                    strRet = "正在打印(Printing)";                    break;                case 0x00004000:                    strRet = "正在处理(Processing)";                    break;                case 0x00020000:                    strRet = "墨粉不足(Toner Low)";                    break;                case 0x00100000:                    strRet = "需要用户干预(User Intervention)";                    break;                case 0x20000000:                    strRet = "等待(Waiting)";                    break;                case 0x00010000:                    strRet = "热机中(Warming Up)";                    break;                default:                    strRet = "未知状态(Unknown Status)";                    break;            }            return strRet;        }        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]        public static extern bool OpenPrinter(string printer, out IntPtr handle, ref structPrinterDefaults pDefault);        [DllImport("winspool.drv")]        public static extern bool ClosePrinter(IntPtr handle);        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]        public static extern bool GetPrinter(IntPtr handle, Int32 level, IntPtr buffer, Int32 size, out Int32 sizeNeeded);        internal static int GetPrinterStatusInt(string PrinterName)        {            int intRet = 0;            IntPtr hPrinter;                        structPrinterDefaults defaults = new structPrinterDefaults();                        if (OpenPrinter(PrinterName, out hPrinter, ref defaults))            {                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;        }          [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]        internal struct structPrinterDefaults        {            [MarshalAs(UnmanagedType.LPTStr)]            public String pDatatype;            public IntPtr pDevMode;            [MarshalAs(UnmanagedType.I4)]            public int DesiredAccess;        };        //状态枚举        [FlagsAttribute]        internal enum PrinterStatus        {            PRINTER_STATUS_BUSY = 0x00000200,            PRINTER_STATUS_DOOR_OPEN = 0x00400000,            PRINTER_STATUS_ERROR = 0x00000002,            PRINTER_STATUS_INITIALIZING = 0x00008000,            PRINTER_STATUS_IO_ACTIVE = 0x00000100,            PRINTER_STATUS_MANUAL_FEED = 0x00000020,            PRINTER_STATUS_NO_TONER = 0x00040000,            PRINTER_STATUS_NOT_AVAILABLE = 0x00001000,            PRINTER_STATUS_OFFLINE = 0x00000080,            PRINTER_STATUS_OUT_OF_MEMORY = 0x00200000,            PRINTER_STATUS_OUTPUT_BIN_FULL = 0x00000800,            PRINTER_STATUS_PAGE_PUNT = 0x00080000,            PRINTER_STATUS_PAPER_JAM = 0x00000008,            PRINTER_STATUS_PAPER_OUT = 0x00000010,            PRINTER_STATUS_PAPER_PROBLEM = 0x00000040,            PRINTER_STATUS_PAUSED = 0x00000001,            PRINTER_STATUS_PENDING_DELETION = 0x00000004,            PRINTER_STATUS_PRINTING = 0x00000400,            PRINTER_STATUS_PROCESSING = 0x00004000,            PRINTER_STATUS_TONER_LOW = 0x00020000,            PRINTER_STATUS_USER_INTERVENTION = 0x00100000,            PRINTER_STATUS_WAITING = 0x20000000,            PRINTER_STATUS_WARMING_UP = 0x00010000        }        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 UInt32 Attributes;            public UInt32 Priority;            public UInt32 DefaultPriority;            public UInt32 StartTime;            public UInt32 UntilTime;            public UInt32 Status;            public UInt32 cJobs;            public UInt32 AveragePPM;        }        public static void Main()        {            Console.WriteLine(CSCPrintClass.GetPrinterStatus("EPSON LQ-680K II ESC/P2").ToString());            Console.ReadLine();        }   } 


我现在遇到的问题是:
1,我打印机没有连接,调用OpenPrinter函数返回的也是true;
2,GetPrinter函数返回的一直是0(准备就绪(Ready));
请各位能帮我解决,谢谢!!!

 

[解决办法]
学习中… 

[解决办法]
http://hi.baidu.com/adaeniac/blog/item/332c69b576ae55c936d3ca07.html
[解决办法]
真是 达叔, 换了别人 我肯定懒的看这么多代码了。。。

---------------------

看这里: 

structPrinterDefaults defaults = new structPrinterDefaults();

if (OpenPrinter(PrinterName, out hPrinter, ref defaults))

----------------
你实例化了一个 structPrinterDefaults 对象。

ref defaults 中的 defaults 你需要给它 赋 初始值

这是 ref 和 out 的区别。

你有给这个 defaults 赋值吗???
[解决办法]
这段代码存在问题
参考

热点排行