前言
工作需要,目前开发并一直负责维护着打印机SDK,该篇主要讲解如何设置打印机暂停打印,这里的暂停打印是使打印机状态处于暂停状态,而不是暂停某个打印任务。
一、SetPrinter函数简介
SetPrinter 函数允许应用程序更改各种打印机属性,函数原型如下:
BOOL WINAPI SetPrinter(
_In_ HANDLE hPrinter,
_In_ DWORD Level,
_In_ LPBYTE pPrinter,
_In_ DWORD Command
);
hPrinter:要更改其设置的打印机的句柄
Level :指定函数存储到pPrinter指向的缓冲区中的数据类型。如果参数Command不等于零,则Level参数必须为零
lpbPrinter:指向包含要为打印机设置的数据或包含命令参数指定的命令信息的缓冲区的指针。缓冲区中的数据类型由Level的值决定。如果参数Level为零,就设为NULL
Command:如果Level参数为非零,则Command必须为零。打印机将保留打印机当前的状态,并重新配置打印机的当前状态。如果Level参数为零,则Command可以是以下值之一来设置打印机的状态。
Value | Meaning |
---|---|
PRINTER_CONTROL_PAUSE | 暂停打印机 |
PRINTER_CONTROL_PURGE | 删除打印机的所有作业 |
PRINTER_CONTROL_RESUME | 恢复一台暂停的打印机 |
PRINTER_CONTROL_SET_STATUS | 载入打印机的PRINTER_CONTROL_STATUS结构 |
二、使用步骤
1.使用方法
代码如下(示例):
#include <windows.h>
#include <string.h>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
// 功能:暂停打印任务
// 参数:[in]bStop TRUE-暂停 FALSE-恢复打印
// 返回:成功返回0,其他失败
int StopPrintJob(BOOL bStop)
{
// 获取当前默认打印机
DWORD dwNameLen = MAX_PATH;
TCHAR szPrinterName[MAX_PATH] = { 0 };
GetDefaultPrinter(szPrinterName, &dwNameLen);
// OpenPrinter一定要加上这个设置权限,不然后面会SetPrinter设置失败,GetLastError()返回5-拒绝访问;
// 另外,使用Unicode字符集声明PRINTER_DEFAULTSW,使用多字节字符集需要声明PRINTER_DEFAULTSA,我这边用的是Unicode字符集
PRINTER_DEFAULTSW defaultSw = { NULL, NULL, PRINTER_ACCESS_ADMINISTER };
// 根据打印机名称打开打印机
int iRet = 0;
HANDLE hPrinter = NULL;
BOOL bRet = OpenPrinter(szPrinterName, &hPrinter, &defaultSw);
if (!bRet)
{
// 打开打印机失败
return -1;
}
// 默认暂停打印
DWORD dwCommand = JOB_CONTROL_PAUSE;
if (!bStop)
{
// 如果不是暂停,那就是恢复打印
dwCommand = JOB_CONTROL_RESUME;
}
// 暂停/恢复打印机
DWORD dwLastError = 0;
bRet = SetPrinter(hPrinter, 0, 0, dwCommand);
if (!bRet)
{
// 暂停/恢复打印机失败
iRet = -2;
dwLastError = GetLastError();
}
// 关闭打印机
bRet = ClosePrinter(hPrinter);
if (!bRet)
{
// 关闭打印机失败
iRet = -3;
}
return iRet;
}
int main()
{
StopPrintJob(TRUE);
StopPrintJob(FALSE);
return 0;
}
2.使用效果
打开打印队列控制面板,如果是暂停打印机,效果图如下:
当前暂停打印选项是勾选的,如果现在点击文档打印,打印任务不会下发到打印机,会在打印队列中排队等候,如果恢复暂停的打印机,效果图如下:
此时暂停打印选项的勾选已被取消,如果此时打印队列中有任务,则开始往打印机下发任务,打印机开始打印
总结
该篇讲述的功能,主要是配合我另外一篇博客C++获取打印文件页数一起使用,在调用打印文件之前,先暂停打印机,然后再获取打印文件页数,最后再恢复打印,以后再也不用担心获取文件页数不准了,岂不快哉啊🤣