// 判断打印机是否正在打印
HRESULT GetPrinterStatus(CString strPrinterName)
{
HRESULT hRet = E_FAIL;
HANDLE hPrinter;
if (!OpenPrinter(strPrinterName.GetBuffer(0), &hPrinter, NULL))
return hRet;
DWORD nByteNeeded;
DWORD nReturned;
DWORD nByteUsed;
PRINTER_INFO_2* pPrinterInfo = NULL;
GetPrinter(hPrinter, 2, NULL, 0, &nByteNeeded);
pPrinterInfo = (PRINTER_INFO_2*)malloc(nByteNeeded);
GetPrinter(hPrinter, 2, (LPBYTE)pPrinterInfo, nByteNeeded, &nByteUsed);
JOB_INFO_2* pJobInfo = NULL;
EnumJobs(hPrinter, 0, pPrinterInfo->cJobs, 2, NULL, 0,
(LPDWORD)&nByteNeeded, (LPDWORD)&nReturned);
pJobInfo = (JOB_INFO_2*)malloc(nByteNeeded);
ZeroMemory(pJobInfo, nByteNeeded);
EnumJobs(hPrinter, 0, pPrinterInfo->cJobs, 2, (LPBYTE)pJobInfo, nByteNeeded,
(LPDWORD)&nByteUsed, (LPDWORD)&nReturned);
if (pPrinterInfo->cJobs == 0)
hRet = S_OK;
else
{
hRet = S_OK;
for (int i = 0; i < nReturned; ++i)
{
if (pJobInfo[i].Status & JOB_STATUS_PRINTING)
{
hRet = E_FAIL; // 表示打印机还在打印
break;
}
}
}
free(pPrinterInfo);
ClosePrinter(hPrinter);
return hRet;
}