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;
}
作者“LaoKa”