日期:2014-05-18  浏览次数:21192 次

如何获取打印机状态(缺纸,缺墨。。。)
我使用的是网络打印机,如何在C#下获取打印机状态(缺纸,缺墨。。。),谢谢。

------解决方案--------------------
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;
}

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(p