前面工作需要对打印机的部分功能进行调用,主要是获取和设置默认打印机,修改纸张尺寸,修改打印方向等。
因此封装了如下的代码。
头文件

/*** 获取默认打印机名字* @param name: 打印机名字* @param name: 名字buffer长度* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int getDefaultPrinter(char *printerName, unsigned int bufferLen);/** 设置默认打印机* @param printerName: 打印机名字* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int setDefaultPrinter(const char *printerName);/*增加规格 自定义纸张* @param printerName: 打印机名字* @param paperName: 纸张名字* @param width: 宽度 单位:cm* @param hight: 高度 单位:cm* @param leftMargin: 左边距 单位:cm* @param topMargin: 上边距 单位:cm* @param rightMargin: 右边距 单位:cm* @param bottomMargin: 下边距 单位:cm* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int addCustomPaper(const char *printerName, const char *paperName, unsigned int width, unsigned int hight,unsigned leftMargin, unsigned int topMargin, unsigned int rightMargin, unsigned int bottomMargin);/* 删除纸张* @param printerName: 打印机名字* @param paperName: 纸张名字* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int deleteCustormPaper(const char *printerName, const char *paperName);/* 获取纸张尺寸* @param printerName: 打印机名字* @param paperName: 纸张名字* @param bufferLen: 缓冲区长度* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int getPaperSize(const char *printerName, char *paperName, unsigned int bufferLen);/* 设置打印机默认纸张和方向* @param printerName: 打印机名字* @param paperName: 纸张名字* @param orientation: 打印方向 1-纵向 2-横向* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int setPaper(const char *printerName, const char *paperName, short orientation);/* 设置打印机方向* @param printerName: 打印机名字* @param orientation: 打印方向 1-纵向 2-横向* @return: 0-获取成功 1-获取失败*/DLLEXPORT_API int setOrientation(const char *printerName, short orientation);

实现

#include <Windows.h>
//注意这里必须头文件windows.h在winbase前面
//否则错误error C4430
#include <winbase.h>typedef TCHAR PAPERNAME[64];int isWindowsNT() {OSVERSIONINFO vi;vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);BOOL ret = GetVersionEx(&vi);if (!ret) {return FALSE;}return vi.dwPlatformId == VER_PLATFORM_WIN32_NT;
}HANDLE getPrinterHandle(LPCTSTR printerName)
{PRINTER_DEFAULTS pds;HANDLE hPrinter = NULL;ZeroMemory(&pds, sizeof(PRINTER_DEFAULTS));pds.DesiredAccess = PRINTER_ALL_ACCESS;OpenPrinter((LPSTR)printerName, &hPrinter, &pds);return hPrinter;
}short getPaperSize1(LPCTSTR szPrinterName, LPCTSTR szPortName, PAPERNAME szPaperName)
{short nPaperSize = -1;//获得可用打印机纸张类型数目int nNeeded = DeviceCapabilities(szPrinterName, szPortName, DC_PAPERNAMES, NULL, NULL);if (nNeeded){PAPERNAME *pszPaperNames = new PAPERNAME[nNeeded]; //分配纸张名称数组//获得可用打印机纸张名称数组if (DeviceCapabilities(szPrinterName, szPortName, DC_PAPERNAMES, (LPTSTR)pszPaperNames, NULL) != -1){int i;//查找纸张类型szPaperName在数组中的索引for (i = 0; i < nNeeded && strcmp(pszPaperNames[i], szPaperName); i++);if (i < nNeeded){//获得可用打印机纸张尺寸号数目(应该等于打印机纸张类型数目)nNeeded = DeviceCapabilities(szPrinterName, szPortName, DC_PAPERS, NULL, NULL);if (nNeeded){LPWORD pPapers = new WORD[nNeeded]; //分配纸张尺寸号数组//获得可用打印机纸张尺寸号数组if (DeviceCapabilities(szPrinterName, szPortName, DC_PAPERS, (LPSTR)pPapers, NULL) != -1)nPaperSize = pPapers[i]; //获得纸张类型szPaperName对应的尺寸号delete[]pPapers;}}}delete[]pszPaperNames;}return nPaperSize;
}//获取打印机详细信息,返回的指针用后必须以GlobalFree释放
PRINTER_INFO_2 *getInfo2(LPCTSTR szPrinterName)
{HANDLE hPrinter = getPrinterHandle(szPrinterName);PRINTER_INFO_2 *ppi2 = NULL;DWORD cbNeeded = 0;if (hPrinter){GetPrinter(hPrinter, 2, 0, 0, &cbNeeded);if (cbNeeded){ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, cbNeeded);if (ppi2){if (!GetPrinter(hPrinter, 2, (LPBYTE)ppi2, cbNeeded, &cbNeeded)){GlobalFree((HGLOBAL)ppi2);ppi2 = NULL;}}}ClosePrinter(hPrinter);}return ppi2;
}//打印机设置
BOOL SetInfo2(PRINTER_INFO_2 *ppi2)
{HANDLE hPrinter = getPrinterHandle(ppi2->pPrinterName);BOOL bOk = FALSE;DWORD fMode;if (hPrinter){fMode = DM_IN_BUFFER | DM_OUT_BUFFER;bOk = (DocumentProperties(NULL, hPrinter,ppi2->pPrinterName,ppi2->pDevMode,ppi2->pDevMode,fMode) == IDOK &&::SetPrinter(hPrinter, 2, (LPBYTE)ppi2, 0));ClosePrinter(hPrinter);}return bOk;
}int getDefaultPrinter(char *name, unsigned int bufferLen) {char tempPrinterName[256] = { 0 };unsigned long len = 256;BOOL result = GetDefaultPrinter(tempPrinterName, &len);if (!result || len == 0 || strlen(tempPrinterName) == 0) {return 1;}if (strlen(tempPrinterName) > bufferLen) {return 1;}strncpy_s(name, bufferLen, tempPrinterName, len);return 0;
}/** 设置默认打印机
* @param printerName: 打印机名字
* @return: 0-获取成功 1-获取失败
*/
int setDefaultPrinter(const char *printerName) {return SetDefaultPrinter((LPTSTR)printerName) ? 0 : 1;
}int addCustomPaper(const char *printerName, const char *paperName, unsigned int width, unsigned int hight,unsigned int leftMargin, unsigned int topMargin, unsigned int rightMargin, unsigned int bottomMargin)
{if (!isWindowsNT()) {return 1;}FORM_INFO_1 fi1;fi1.Flags = FORM_USER;fi1.pName = (LPTSTR)paperName;fi1.Size.cx = width * 100;fi1.Size.cy = hight * 100;fi1.ImageableArea.left = leftMargin * 100;fi1.ImageableArea.top = topMargin * 100;fi1.ImageableArea.right = fi1.Size.cx - rightMargin * 100;fi1.ImageableArea.bottom = fi1.Size.cy - bottomMargin * 100;HANDLE hPrinter = getPrinterHandle(printerName);BOOL bOk = false;if (hPrinter) {//已存在就修改纸张//否则添加自定义纸张bOk = (SetForm(hPrinter, (LPSTR)paperName, 1, (LPBYTE)&fi1) || AddForm(hPrinter, 1, (LPBYTE)&fi1));ClosePrinter(hPrinter);}return !bOk;
}int deleteCustormPaper(const char *printerName, const char *paperName)
{if (!isWindowsNT()) {return 1;}BOOL bOk = FALSE;HANDLE hPrinter = getPrinterHandle(printerName);if (hPrinter) {bOk = DeleteForm(hPrinter, (LPSTR)paperName);ClosePrinter(hPrinter);}return !bOk;
}int getPaperSize(const char *printerName, char *paperName, unsigned int bufferLen)
{PRINTER_INFO_2 *ppi2 = getInfo2(printerName);if (ppi2 == NULL) {return 1;}int retLen = strlen((const char *)ppi2->pDevMode->dmFormName);if (retLen > bufferLen) {return 1;}strncpy(paperName, (const char *)ppi2->pDevMode->dmFormName, retLen);return 0;
}int setPaper(const char *printerName, const char *paperName, short orientation)
{BOOL bOk = FALSE;PRINTER_INFO_2 *ppi2 = getInfo2(printerName);if (ppi2) {short nPaperSize = getPaperSize1(printerName, ppi2->pPortName, (TCHAR *)paperName);if (nPaperSize != -1) {ppi2->pDevMode->dmFields = DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH | DM_ORIENTATION;ppi2->pDevMode->dmPaperSize = nPaperSize;ppi2->pDevMode->dmPaperWidth = 0;ppi2->pDevMode->dmPaperLength = 0;ppi2->pDevMode->dmOrientation = orientation;bOk = SetInfo2(ppi2);}GlobalFree((HGLOBAL)ppi2);}return !bOk;
}int setOrientation(const char *printerName, short orientation)
{BOOL bOk = FALSE;PRINTER_INFO_2 *ppi2 = getInfo2(printerName);if (ppi2) {ppi2->pDevMode->dmFields = DM_ORIENTATION;ppi2->pDevMode->dmOrientation = orientation;bOk = SetInfo2(ppi2);}GlobalFree((HGLOBAL)ppi2);return !bOk;
}

Windows打印机API封装相关推荐

  1. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)

    本篇介绍使用循环语句实现指定符号的坐标移动,使用到了while(1){}进行实时响应,if(表达式){},switch(表达式){},windows中封装的API并对API进行自行封装使用. 1.实现 ...

  2. windows环境下封装条件wait和signal

    linux 环境有提供好的pthread_cond_wait() 和 phread_signal().pthread_broadcast() windows需要自己封装,利用semophore控制线程 ...

  3. Windows恶意软件API调用特征分析

    本文讲的是Windows恶意软件API调用特征分析, 1.背景 目标: 1)找到病毒调用概率高的API 2)找到病毒调用概率不高,但是当调用频次高的时候,是病毒概率高的API. 通常对病毒使用API的 ...

  4. 初步了解Windows Safer API

    Safer API,应为Windows提供的安全性API: 下面来调用其中一个函数看一下: SaferCreateLevel 函数,其功能是打开一个SAFER_LEVEL_HANDLE句柄: 函数的微 ...

  5. 安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快

    安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快 本文适用于以下产品: Microsoft Visual Studio 2010 如果未安装 Wi ...

  6. rest api封装调用_如何从云功能调用外部REST API

    rest api封装调用 在之前的博客文章中,我展示了如何创建您的第一个云功能 (以及一个视频 ). 您的云函数很可能需要调用外部REST API. 以下教程将向您展示如何创建此类功能(非常简单). ...

  7. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    C#开发微信门户及应用(32)--微信支付接入和API封装使用 在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去, ...

  8. 安装 Windows 自动化 API 3.0 时,visual Studio 2010 更快地运行

    如果未安装 Windows 自动化 API 3.0,使用 Windows 自动化 api 的应用程序可以显著减少 Microsoft Visual Studio 智能感知性能. 例如,Windows ...

  9. 使用windows crypto API加密解密

    2019独角兽企业重金招聘Python工程师标准>>> 其实,使用windows API编程并不难,首先要有信心.MSDN提供了详细的帮助和指南,许多问题,只要详细查阅MSND,完全 ...

最新文章

  1. 什么是以太坊?它到底怎么运作的?
  2. 智能音箱二战:国内Q1出货量5倍增长,BAX上屏、扩类、做家居
  3. ma5626如何进入web配置_如何给Dnsmasq提供一个Web配置界面?
  4. Windows Server 2012 下安装MySQL 5.6 X64位包
  5. excel实战应用案例100讲(十三)-使用Python 对 Excel文件进行批量操作
  6. Android开发-Hello World+phonegap(Cordova)
  7. arm linux gcc交叉编译,arm-linux-gcc交叉编译器安装
  8. java自动封箱_java自动封箱是什么意思
  9. 1.Kettle下载与安装
  10. 使用MATLAB绘制Smith圆图
  11. uniapp选择图片及图片预览的实现
  12. php打印机,用PHP打印到打印机
  13. 如何判断是否是ssd硬盘?win10查看固态硬盘的方法
  14. 肝了一晚帮她搭建完个人网站——利用Docker在单节点上实现内外网隔离网站部署(Nginx、Wordpress、MySQL)
  15. 画一只会动的皮卡丘(上)
  16. 阿里健康四面,阿里飞猪技术两面经历分享,已进阿里飞猪
  17. python背景图颜色_更改特定子图背景颜色(饼图外部)
  18. MAGIX Sequoia 15 v15.5 Windows 高级母带广播音频制作软件
  19. 软件测试价值提升之路--第2部分“扫门前雪”-第5章“测试过程可控”-读书笔记
  20. SYS/BIOS内存分配相关问题

热门文章

  1. ipad协议827版技术分析
  2. 18个最好的代码编辑器/IDE工具,希望你会喜欢。
  3. Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影
  4. MFC界面——实现分割与合并文件
  5. java.sql.SQLSyntaxErrorException: Table ‘H_PERSION‘ doesn‘t exist
  6. 小红书穿搭博主一万粉丝报价是多少?博主如何提高报价
  7. 安川机器人怎样与变位器编程_基于CAM Function的安川机器人弧焊焊接离线编程与离线仿真...
  8. echarts之legend-改变图例的图标为自定义图片
  9. 微博大V社交圈子分析
  10. mysql数据库安装文件多大_MySQL数据库的安装