您的位置:首页 > 其它

spooler API研究——打印机任务截获和设置

2016-12-13 13:42 197 查看
直接上代码:

需包含头文件如下:

#include "Windows.h"

#include <WinSpool.h>    

#pragma comment(lib, "Winspool.lib")  

void ShowPrinterStatus()
{
HANDLE printerHandle;                //打印机设备句柄
PRINTER_INFO_2* pPrinterInfo = NULL;
while(1)
{

//检测打开打印机设备是否成功
if(!OpenPrinter(m_pPrinters->pPrinterName, &printerHandle, NULL))
{
return;
}

DWORD nByteNeeded;
DWORD nReturned;
DWORD nByteUsed;

//通过调用GetPrinter()函数得到作业数量
GetPrinter(printerHandle, 2, NULL, 0, &nByteNeeded);
pPrinterInfo = (PRINTER_INFO_2*)malloc(nByteNeeded);
GetPrinter(printerHandle, 2, (LPBYTE)pPrinterInfo, nByteNeeded, &nByteUsed);

//通过调用EnumJobs()函数枚举打印任务
JOB_INFO_2* pJobInfo = NULL;
EnumJobs(printerHandle, 0, pPrinterInfo->cJobs, 2, NULL, 0,
(LPDWORD)&nByteNeeded, (LPDWORD)&nReturned);
pJobInfo = (JOB_INFO_2*)malloc(nByteNeeded);
ZeroMemory(pJobInfo, nByteNeeded);
EnumJobs(printerHandle, 0, pPrinterInfo->cJobs, 2, (LPBYTE)pJobInfo, nByteNeeded,
(LPDWORD)&nByteUsed, (LPDWORD)&nReturned);

//检测当前是否有打印任务
if(pPrinterInfo->cJobs != 0)
{

//打印第一个任务
printf("%d:%s\n",pJobInfo[0].JobId,pJobInfo[0].pDocument);

//将第一个任务挂起
SetJob(printerHandle,pJobInfo[0].JobId,2,NULL,JOB_CONTROL_PAUSE);

}

free(pPrinterInfo);

//关闭打印机设备
ClosePrinter(printerHandle);

Sleep(10);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息