本帖最后由 jjpweb 于 2011-08-01 16:14:11 编辑

解决方案 »

  1.   

    这个代码没用,原来研究过。
    在MSDN上找到一个,不知道能用不:
    MSDN搜索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;   } 
      

  2.   

    。。给你贴的MSDN代码你都没看啊 
      

  3.   

    这代码无非就是几个API函数还有结构体而已,没有很难懂的代码。
    这东西就是给个思路,自己转换一下就可以了,而且我让他看看MSDN,上面有这段代码的介绍。
      

  4.   

    看了LZ的代码突然想起一点,取得打印机的api是可以取得机器上多个打印机的,LZ是不是没取到正确的那个呢?例如取到的打印机是虚拟打印机或者网络打印机
      

  5.   

    同意楼上,用pinfo[i]把所有的都试试,可以跟踪下看看名称是否都正确。
    还有就是有个默认的打印机,打印时会用它来打印,但它可能不是排在第一个。
      

  6.   

    我也从MSDN上抄了那个代码,pStatus返回值都是0,但用setprinter更改设置状态又能成功。不知道怎么回事。