VC獲取打印機與打印作業的狀態

VC 獲取打印機與打印作業的狀態
#pragma comment(lib, "winspool.lib")
#include "stdafx.h"
#include <winspool.h>
#ifndef _MAX_PATH
#define _MAX_PATH 260
#endif
TCHAR m_tchPrinterMessage[_MAX_PATH];///< 打印結果的返回信息
 
/// 獲取打印作業的狀態
BOOL GetJobs(HANDLE hPrinter,
    JOB_INFO_2 **ppJobInfo,
    int *pcJobs,          
    DWORD *pStatus)       
{
 DWORD       cByteNeeded, nReturned, cByteUsed;
 JOB_INFO_2          *pJobStorage = NULL;
 PRINTER_INFO_2       *pPrinterInfo = NULL;
 
 if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
 {
  DWORD dwErrorCode = ::GetLastError();
  if (dwErrorCode != ERROR_INSUFFICIENT_BUFFER)
   return FALSE;
 }
 pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
 if (!(pPrinterInfo))
 
  return FALSE;
 
 if (!GetPrinter(hPrinter,
  2,
  (LPBYTE)pPrinterInfo,
  cByteNeeded,
  &cByteUsed))
 {
 
  free(pPrinterInfo);
  pPrinterInfo = NULL;
  return FALSE;
 }
 
 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)
 {
 
  free(pPrinterInfo);
  pPrinterInfo = NULL;
  return FALSE;
 }
 ZeroMemory(pJobStorage, cByteNeeded);
 
 if (!EnumJobs(hPrinter,
  0,
  pPrinterInfo->cJobs,
  2,
  (LPBYTE)pJobStorage,
  cByteNeeded,
  (LPDWORD)&cByteUsed,
  (LPDWORD)&nReturned))
 {
  free(pPrinterInfo);
  free(pJobStorage);
  pJobStorage = NULL;
  pPrinterInfo = NULL;
  return FALSE;
 }
 
 *pcJobs = nReturned;
 *pStatus = pPrinterInfo->Status;
 *ppJobInfo = pJobStorage;
 free(pPrinterInfo);
 return TRUE;
}
 
/// 檢測打印機的狀態
/// hPrinter表示打印機Handle
BOOL CheckPrinterStatus(HANDLE hPrinter)
{
 BOOL bResult = PRINT_NOT_EXIST;
 if(NULL == hPrinter)
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機不存在!"));
  return bResult;
 }
 bResult = PRINT_FALSE;
 JOB_INFO_2  *pJobs;
 int         cJobs,i;
 DWORD       dwPrinterStatus;
 
 if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("打印失敗!"));
  return bResult;
 }
 //
 //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))    //打印機的門是開的
 //{
 // free( pJobs );
 // _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
 // return bResult;
 //}
 /// 正在打印
 if(dwPrinterStatus & PRINTER_STATUS_PRINTING)
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("正在打印..."));
  bResult = PRINT_GOING;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAUSED)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印暫停中..."));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_BUSY)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機繁忙,/n被臨時佔用"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_WAITING)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印等待中..."));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_SERVER_OFFLINE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("未連接打印機服務器"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_ERROR)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_JAM)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機卡紙"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_OUT)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印紙位置不正確"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_PROBLEM)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印紙出現問題"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OUTPUT_BIN_FULL)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印輸出已滿"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_NOT_AVAILABLE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機不可用"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_TONER_LOW)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機墨粉不足"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_NO_TONER)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機沒有墨粉"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OUT_OF_MEMORY)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印內存溢出"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OFFLINE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("無法連接打印機,\n可能是打印機未啓動"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_DOOR_OPEN)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印機的門是開着的,\n請關閉"));
  return bResult;
 }
 
 for (i = 0; i < cJobs; ++i)
 {
  /// 如果打印頁正在打印
  if (pJobs[i].Status & JOB_STATUS_PRINTING)
  {
   _tcscpy(m_tchPrinterMessage,_TEXT("正在打印..."));
  
   if (pJobs[i].Status &
    (JOB_STATUS_ERROR |
    JOB_STATUS_OFFLINE |
    JOB_STATUS_PAPEROUT |
    JOB_STATUS_BLOCKED_DEVQ))
   {
    free( pJobs );
    _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
    return bResult;
   }
  }
  ///// 如果打印頁已經打印或刪除
  //if(pJobs[i].Status &
  // (JOB_STATUS_PRINTED|
  //  JOB_STATUS_DELETED))
  //{
  // free( pJobs );
  // ::ClosePrinter(m_hPrintHandle);
  // return PRINT_END;
  //}
  /// 如果打印頁已經打印
  if(pJobs[i].Status & JOB_STATUS_PRINTED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   _tcscpy(m_tchPrinterMessage,_TEXT("打印成功!"));
   bResult = PRINT_TRUE;
   return bResult;
  }
  /// 如果已經刪除打印作業
  else if(pJobs[i].Status & JOB_STATUS_DELETED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   _tcscpy(m_tchPrinterMessage,_TEXT("已取消打印"));
   bResult = PRINT_TRUE;
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_PAUSED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業暫停..."));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_ERROR)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業出錯"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業脫機"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業脫機"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_OFFLINE)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業未連接"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_PAPEROUT)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印紙位置不正確"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_BLOCKED_DEVQ)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業出錯"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_RESTART)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印作業重新啓動"));
   return bResult;
  }
#if (NTDDI_VERSION >= NTDDI_WINXP)
  else if(pJobs[i].Status & JOB_STATUS_COMPLETE)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_TRUE;
   _tcscpy(m_tchPrinterMessage,_TEXT("打印完成"));
   return bResult;
  }
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
 }
 /// 如果不存在打印任務
 if(0 == cJobs)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印結束,\n當前無打印任務!"));
  bResult = PRINT_TRUE;
  return bResult;
 }
 
 free( pJobs );
 _tcscpy(m_tchPrinterMessage,_TEXT("打印成功!"));
 bResult = PRINT_TRUE;
 return bResult;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章