winform 程序  怎么判断打印机的状态是开机还是关机, 是否缺纸  是串口的打印机

解决方案 »

  1.   

    http://msdn.microsoft.com/en-us/library/aa394370%28v=vs.85%29.aspxWin32_PrintJob class用System.Management. ManagementObject 类 和 ManagementObjectCollection 类 
      

  2.   

    string PrintStatus="";
    string[] PS=null;

    //获取状态字符串,并用?作为分割符
    ManagementClass managementClass = new ManagementClass("Win32_Printer");
                ManagementObjectCollection managementObjectCollection = managementClass.GetInstances();
                foreach (ManagementObject managementObject in managementObjectCollection)
                {
    PrintStatus+=(string)managementObject["Status"]+'?'
        }

    PS=split(PrintStatus,'?');
      

  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.   


    ------解决方案--------------------------------------------------------
    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  
    }  ------解决方案--------------------------------------------------------
    比较有用 
      

  5.   


    谢谢  马上测试一下  win  32 api的话` 因为有些时候是在win7  x64电脑上运行`有时候是win7  x32
    有时候是XP 操作系统不定` 所以不太考虑用api