C++设置打印机暂停打印SetPrinter

前言

工作需要,目前开发并一直负责维护着打印机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可以是以下值之一来设置打印机的状态。

ValueMeaning
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++获取打印文件页数一起使用,在调用打印文件之前,先暂停打印机,然后再获取打印文件页数,最后再恢复打印,以后再也不用担心获取文件页数不准了,岂不快哉啊🤣

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_Zhi_Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值