这是我在工作中实现的代码,可以获取默认打印机并打印:

失败返回1,成功返回0

这个函数是用来调用默认打印机的,其实原理很简单就是用GetProfileStringA获取win.ini里的配置信息,得到默认打印机的名字

然后调用CreateDCA、StartDoc、StartPage、TextOutA、EndPage、EndDoc打印机全家桶API函数开始打印

CreateDCA函数是创建一个DC绘图环境,为打印创建一个绘图环境

StartDoc 开始绘图

StartPage 通知打印机开启一个打印作业

SaveDC 保存打印机设备的状态,这一步防止别人调用打印机,是保存打印机状态到设备描述表(设备上下文)里面存储了物理设备相关的信息,当程序与硬件交互时会获取设备上下文状态,告诉windows这个机器是处于什么状态,防止同一系统下别的程序调用这个打印机。

TextOutA 绘制图像

ResetoreDC 恢复打印机状态

EndPage 结束打印

EndDC 结束绘图

#include <Windows.h>
int Print(char str[]) {char szprinter[80];char* szDevice, * szDriver, * szOutput;HDC hdcprint; // 定义一个设备环境句柄//定义一个打印作业static DOCINFO di = { sizeof(DOCINFO),L"printer",NULL };GetProfileStringA("windows", "device", ",,,", szprinter, 80);szDevice = strtok(szprinter, ",");szDriver = strtok(NULL, ",");szOutput = strtok(NULL, ",");if (szDevice && szDriver && szOutput) {if ((hdcprint = CreateDCA(szDriver, szDevice, szOutput, NULL)) != 0) {if (StartDoc(hdcprint, &di) > 0) //开始执行一个打印作业{StartPage(hdcprint); //打印机走纸,开始打印SaveDC(hdcprint); //保存打印机设备句柄  TextOutA(hdcprint, 1, 1, str, strlen(str));RestoreDC(hdcprint, -1); //恢复打印机设备句柄EndPage(hdcprint); //打印机停纸,停止打印EndDoc(hdcprint); //结束一个打印作业//        MessageBox("打印完毕!","提示",MB_ICONINFORMATION);}// 用API函数DeleteDC销毁一个打印机设备句柄DeleteDC(hdcprint);}else {//    MessageBox("没有默认打印机,或者没有安装打印机!");return 1;}}return 0;
}

代码非常简单,你也可以稍微修改一下代码就可以变成指定打印机设备打印

将szprinter指定一个打印机全名就可以了。

当然你也可以指定一个打印机为默认打印机:

 #include <windows.h>int set_print(){char szPrinterName[1024] = { "xxxx" };BOOL ret = SetDefaultPrinterA(szPrinterName);if (ret == FALSE)printf("设置打印机失败");elseprintf("设置打印机成功");
}

遍历打印机驱动:

这段代码可以遍历当前本机上所有的打印机与描述

#include <windows.h>
int get_print(){DWORD            dwFlags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL;LPPRINTER_INFO_2 pPrinters;DWORD            cbPrinters;DWORD            cReturned, i;char             buf[256];EnumPrinters(dwFlags, NULL, 2, NULL, 0, &cbPrinters,&cReturned);if (!(pPrinters = (LPPRINTER_INFO_2)LocalAlloc(LPTR, cbPrinters + 4))){printf("LocalAlloc error\n");}if (!EnumPrinters(dwFlags, NULL, 2, (LPBYTE)pPrinters,cbPrinters, &cbPrinters, &cReturned)){printf("EnumPrinters error\n");}if (cReturned > 0){for (i = 0; i < cReturned; i++){ strcpy(buf, (pPrinters + i)->pPrinterName);strcat(buf, ";");strcat(buf, (pPrinters + i)->pPortName);strcat(buf, ";");strcat(buf, (pPrinters + i)->pDriverName);printf("print:%s\n", buf);memset(buf, 0, 256);}}else {printf("no print!\n");}
}

Windows核心编程调用打印机相关推荐

  1. C++Windows核心编程读书笔记(转)

    http://www.makaidong.com/(马开东博客) 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的 ...

  2. [C++]《Windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  3. 《windows核心编程系列》二谈谈ANSI和Unicode字符集

    第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...

  4. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  5. chHANDLE_DLGMSG(windows核心编程)讲解

    看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...

  6. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  7. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  8. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  9. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

最新文章

  1. 安卓手机也能跑YOLOv5了!
  2. 覆盖索引与联合索引_什么是覆盖索引?
  3. [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
  4. 15、sql语句集,Linux 下PHP查询mysql
  5. DevExpress GridControl功能总结
  6. dom4j-cookbook
  7. 最有价值的100句话
  8. 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)
  9. 【CSS3】制作带光晕的网页“Button“
  10. Zabbix检测Mysql的主从同步
  11. linux下软件的卸载,Linux下各种格式软件的安装及卸载方法
  12. 计算机课评课用语,【数学评课50条】_评课常用语50条
  13. Fiddler自动回复器伪造回复
  14. 全国计算机专业大学排名全部,全国计算机专业大学排名汇总
  15. 坚持定投3年,我赚了多少钱?
  16. 一个web页面的访问的过程
  17. NVIDIA CUDA初级教程(P2-P3)CPU体系架构概述、并行程序设计概述
  18. 利用VBA在Word中排出漂亮的代码
  19. python回文数判定_python如何写一个函数判断回文数?
  20. spark大小表join操作

热门文章

  1. idea中git替换,推送到新的github或者gitlab上面
  2. ubuntu 安装 virt-manager 虚拟机
  3. 为什么mysql查询结果有前缀_字符串的公共前缀对Mysql B+树查询影响回溯分析
  4. c++ 海战棋_编程入门须知:都说零基础不好学编程,那么什么是编程基础?
  5. python实时监控_python实时监控cpu小工具
  6. fiddler弱网测试_用fiddler实现弱网测试
  7. 网关转发其他微服务后头信息拿不到_微服务之基于Zuul自研服务网关
  8. 苹果CMS V10 播放记录_苹果cms采集后无法播放怎么解决?
  9. 跟驰理论 matlab,[自然科学]第4章 跟驰理论.ppt
  10. C# ashx生成的验证码