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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值