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

解决方案 »

  1.   

    用API罗不过每种打印机的驱动都不一样,如果有通用接口好办,否则就麻烦了
      

  2.   

    可以实现
    调用打印机api 
      

  3.   

    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 
      } 
      

  4.   

    enum PrinterStatus 
    {
     其他状态= 1,
     未知,
     空闲,
     正在打印,
     预热,
     停止打印,
     打印中,
     离线
    }其中的"正在打印"和"打印中"是同一个意思,至于为什么会是这样,目前还不知道.在程序中添加System.Management的引用:using System.Management;然后编写获取打印机状态的函数如下:/// <summary>
      /// 获取打印机的当前状态
      /// </summary>
      /// <param name="PrinterDevice">打印机设备名称</param>
      /// <returns>打印机状态</returns>
      private PrinterStatus GetPrinterStat(string PrinterDevice)
      {
       PrinterStatus ret=0;
       string path=@"win32_printer.DeviceId='"+PrinterDevice+"'";
       ManagementObject printer=new ManagementObject(path);
       printer.Get();
       ret=(PrinterStatus)Convert.ToInt32(printer.Properties["PrinterStatus"].Value);
       return ret;
      }调用示例:MessageBox.Show(GetPrinterStat("\\\\192.168.0.88\\Samsung SCX-4x16 Series").ToString());
      

  5.   

     using   System.Management;   
        
          private   ManagementObjectSearcher   query;   
          private   ManagementObjectCollection   queryCollection;   
          string   _classname="SELECT   *   FROM   Win32_Printer";   
        
        query=new   ManagementObjectSearcher(_classname);                           
        queryCollection   =   query.Get();   
        
        foreach   (ManagementObject   mo   in   queryCollection)   
        {                   
              if   (string.Compare(mo["Name"].ToString(),PrinterName,true)==0)   
              {   
                      mo.InvokeMethod("SetDefaultPrinter",null);       //调用了其方法,可修改此处获取相关状态属性   
                      break;   
              }   
        }   
      相同的方法,你在得到具体的打印机实例时,可以获取到其相关属性,再显示出来即可。
      

  6.   

    以前VB6时用过~~ 但现在要C#的 又不管用了,得重写! 呵呵~ 用系统API了!~
      

  7.   

    添加引用 System.Printing
    bool x=System.Printing.LocalPrintServer.GetDefaultPrintQueue().IsTonerLow; // 是否缺墨      
    不知道能不能用,还有很多的状态Is判断
      

  8.   

    简单而且强大!请注意必须添加引用 System.Printing