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

怎么获取打印机状态(缺纸,缺墨。)

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

如何获取打印机状态(缺纸,缺墨。。。)
我使用的是网络打印机,如何在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(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 


[解决办法]
比较有用

热点排行