如何判断打印机是否处于联机或者可用状态!,可以是网络上的打印机

解决方案 »

  1.   

    你必须使用Windows API,具体步骤参考:微软的Knowledge Base的文章:“Q160129 OWTO: Get the Status of a Printer and a Print Job”。下面是部分例子: 
         BOOL GetJobs(HANDLE hPrinter, /* Handle to the printer. */ 
         
         JOB_INFO_2 **ppJobInfo, /* Pointer to be filled. */ 
         int *pcJobs, /* Count of jobs filled. */ 
         DWORD *pStatus) /* Print Queue status. */ 
         
         { 
         
         DWORD cByteNeeded, 
         nReturned, 
         cByteUsed; 
         JOB_INFO_2 *pJobStorage = NULL; 
         PRINTER_INFO_2 *pPrinterInfo = NULL; 
         
         /* Get the buffer size needed. */ 
         if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded)) 
         { 
         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) 
         return FALSE; 
         } 
         
         pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded); 
         if (!(pPrinterInfo)) 
         /* Failure to allocate memory. */ 
         return FALSE; 
         
         /* Get the printer information. */ 
         if (!GetPrinter(hPrinter, 
         2, 
         (LPSTR)pPrinterInfo, 
         cByteNeeded, 
         &cByteUsed)) 
         { 
         /* Failure to access the printer. */ 
         free(pPrinterInfo); 
         pPrinterInfo = NULL; 
         return FALSE; 
         } 
         
         /* Get job storage space. */ 
         if (!EnumJobs(hPrinter, 
         0, 
         pPrinterInfo->cJobs, 
         2, 
         NULL, 
         0, 
         (LPDWORD)&cByteNeeded, 
         (LPDWORD)&nReturned)) 
         { 
         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) 
         { 
         free(pPrinterInfo); 
         pPrinterInfo = NULL; 
         return FALSE; 
         } 
         } 
         
         pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded); 
         if (!pJobStorage) 
         { 
         /* Failure to allocate Job storage space. */ 
         free(pPrinterInfo); 
         pPrinterInfo = NULL; 
         return FALSE; 
         } 
         
         ZeroMemory(pJobStorage, cByteNeeded); 
         
         /* Get the list of jobs. */ 
         if (!EnumJobs(hPrinter, 
         0, 
         pPrinterInfo->cJobs, 
         2, 
         (LPBYTE)pJobStorage, 
         cByteNeeded, 
         (LPDWORD)&cByteUsed, 
         (LPDWORD)&nReturned)) 
         { 
         free(pPrinterInfo); 
         free(pJobStorage); 
         pJobStorage = NULL; 
         pPrinterInfo = NULL; 
         return FALSE; 
         } 
         
         /* 
         * Return the information. 
         */ 
         *pcJobs = nReturned; 
         *pStatus = pPrinterInfo->Status; 
         *ppJobInfo = pJobStorage; 
         free(pPrinterInfo); 
         
         return TRUE; 
         
         } 
         
         BOOL IsPrinterError(HANDLE hPrinter) 
         { 
         
         JOB_INFO_2 *pJobs; 
         int cJobs, 
         i; 
         DWORD dwPrinterStatus; 
         
         /* 
         * Get the state information for the Printer Queue and 
         * the jobs in the Printer Queue. 
         */ 
         if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus)) 
         return FALSE; 
         
         /* 
         * If the Printer reports an error, believe it. 
         */ 
         if (dwPrinterStatus & 
         (PRINTER_STATUS_ERROR | 
         PRINTER_STATUS_PAPER_JAM | 
         PRINTER_STATUS_PAPER_OUT | 
         PRINTER_STATUS_PAPER_PROBLEM | 
         PRINTER_STATUS_OUTPUT_BIN_FULL | 
         PRINTER_STATUS_NOT_AVAILABLE | 
         PRINTER_STATUS_NO_TONER | 
         PRINTER_STATUS_OUT_OF_MEMORY | 
         PRINTER_STATUS_OFFLINE | 
         PRINTER_STATUS_DOOR_OPEN)) 
         { 
         return TRUE; 
         } 
         
         /* 
         * Find the Job in the Queue that is printing. 
         */ 
         for (i=0; i < cJobs; i++) 
         { 
         if (pJobs[i].Status & JOB_STATUS_PRINTING) 
         { 
         /* 
         * If the job is in an error state, 
         * report an error for the printer. 
         * Code could be inserted here to 
         * attempt an interpretation of the 
         * pStatus member as well. 
         */ 
         if (pJobs[i].Status & 
         (JOB_STATUS_ERROR | 
         JOB_STATUS_OFFLINE | 
         JOB_STATUS_PAPEROUT | 
         JOB_STATUS_BLOCKED_DEVQ)) 
         { 
         return TRUE; 
         } 
         } 
         } 
         
         /* 
         * No error condition. 
         */ 
         return FALSE; 
         
         }