C#获取打印机状态的问题

windows的API获取:

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 
  } 

 

 

 

在。net3.0以后的版本 System.Printing命名空间 提供了不少打印机方面的东西;

 

 

bool x=System.Printing.LocalPrintServer.GetDefaultPrintQueue().IsTonerLow; // 是否缺墨

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值