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  
  }  

  

posted @ 2012-08-13 14:32  小锋神  阅读(19364)  评论(3编辑  收藏  举报