本文主要介绍如何获取以及设置系统的默认打印机。

1.获取系统中的所有打印机

  获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地、网络打印机信息。其函数原型为:

1 BOOL WINAPI EnumPrinters(
2     DWORD   Flags,
3     LPSTR   Name,
4     DWORD   Level,
5     LPBYTE  pPrinterEnum,
6     DWORD   cbBuf,
7     LPDWORD pcbNeeded,
8     LPDWORD pcReturned
9 );

  其中,参数Flags可以是以下标志量的组合:

  PRINTER_ENUM_LOCAL:枚举本地打印机(包括Window95中的网络打印机)

  PRINTER_ENUM_NAME:枚举由参数Name指定的打印机,如果参数Name为NULL,则枚举出所有可用的打印机

  PRINTER_ENUM_SHARE:枚举出共享打印机(必须同其他标志量组合使用)

  PRINTER_ENUM_CONNECTIONS:枚举网络列表中的打印机(仅适用于NT)

  PRINTER_ENUM_NETWORK:枚举通过网络连接的打印机(参数Level必须为1,仅适用于NT)

  参数Name表示同本机连接的打印机。

  参数Level表示级别(取值为1、2、4、5,4仅适用于NT,5仅适用于Win95和NT4.0)。

  参数pPrinterEnum表示PRINTER_ENUM_x结构的缓冲区,其中x代表级别。

  参数cbBuf表示PRINTER_ENUM_x结构的缓冲区字节大小。

  参数pcbNeeded表示实际读入的字节数量。

  参数pcReturned表示载入缓冲区的结构数量。

  如下的代码示例了如何通过使用EnumPrinters()函数来获取系统中的所有打印机:

 1 /*
 2  * 函数功能 : 获取系统中所有的打印机名称
 3  * 备    注 :
 4  * 作    者 :
 5  */
 6 CString CPrintDemoDlg::GetAllPrinterName()
 7 {
 8     DWORD dwSize;
 9     DWORD dwPrinters;
10     CString strPrintersName = _T("");
11
12     //第一次调用得到结构体的大小
13     ::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
14         NULL, 5, NULL, 0, &dwSize, &dwPrinters);
15
16     //第二次调用得到打印机列表
17     BYTE *pBuffer = new BYTE[dwSize];
18     ::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
19         NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);
20
21     //得到所有的打印机名称
22     if(dwPrinters != 0)
23     {
24         PRINTER_INFO_5 *pPrinterInfo = (PRINTER_INFO_5 *)pBuffer;
25         for(int i=0; i<dwPrinters; i++)
26         {
27             strPrintersName += pPrinterInfo->pPrinterName;        //得到打印机名称
28             strPrintersName += _T("\r\n");
29             pPrinterInfo++;
30         }
31     }
32     delete []pBuffer;
33
34     return strPrintersName;
35 }

  其中,EnumPrinters()函数被调用了两次,第一次调用是为了得到结构体的大小dwSize,以便申请适当的内存空间大小,第二次调用是为了得到打印机列表。结构体PRINTER_INFO_5中的pPrinterName字段存储了打印机的名称。返回值strPrintersName保存了查找到得系统中所有打印机名称,如图1所示。

图1 当前系统中的所有打印机

  这与控制面板->打印机与传真中列出的当前系统中所有打印机是一致的,如图2所示。

图2 当前系统中的所有打印机

  需要注意的一点是,使用EnumPrinters()函数时,需要包含头文件winspool.h和库文件Winspool.lib,具体方法如下:

1 #include <winspool.h>
2 #pragma comment(lib, "Winspool.lib")

2.获取系统的默认打印机

  由图2可以看出,在系统默认打印机(Adobe PDF)的图标上会有一个“√”符号,以示与其他非默认打印机的区别。那么我们如何通过程序来获取系统的默认打印机呢?

  CPrintDialog类封装了Windows通用打印对话框,其成员函数GetDefaults()能够在打印对话框不显示的情况下获取当前打印机的缺省状态,而不需要用户的交互作用。

  此外,该类还提供了一系列函数,用于获取和设置打印参数,如:

  GetDeviceName();     //获取打印机名称

  GetCopies();        //获取打印份数

  GetFromPage();       //获取打印起始页码

  GetToPage();       //获取打印结束页码

  等等,我们要获取系统的默认打印机,可以使用GetDeviceName()函数来实现。如下的代码示例了如何获取打印机名称、打印机驱动名和打印机端口:

 1 /*
 2  * 函数功能 : 获取系统的默认打印机
 3  * 备    注 :
 4  * 作    者 :
 5  */
 6 CString CPrintDemoDlg::GetSystemDefaultPrinter()
 7 {
 8     CString strPrinterInfo = _T("");
 9
10     CPrintDialog printDialog(FALSE);                        //构造打印设置对话框对象
11     printDialog.GetDefaults();                              //获取默认打印设备的设备环境
12     CString strDeviceName = printDialog.GetDeviceName();    //获取当前打印机的名称
13     CString strDriverName = printDialog.GetDriverName();    //获取当前打印机的驱动名
14     CString strPortName = printDialog.GetPortName();        //获取当前打印机的端口
15     strPrinterInfo += _T("打印机名称: ") + strDeviceName + _T("\r\n");
16     strPrinterInfo += _T("打印机驱动: ") + strDriverName + _T("\r\n");
17     strPrinterInfo += _T("打印机端口: ") + strPortName + _T("\r\n");
18
19     return strPrinterInfo;
20 }

  其中,返回值strPrinterInfo保存了系统默认打印机的名称、驱动名和端口。如图3所示。

图3 系统默认打印机

3.设置系统默认打印机

  如果我们想要设置系统的默认打印机,又该怎么做呢?其实,使用SetDefaultPrinter()函数就可以了。但是,在使用这个函数之前,需要确认在winspool.h文件中是否对该函数进行了定义。如果没有,我们就需要在winspool.h文件中添加以下代码段:

 1 BOOL
 2 WINAPI SetDefaultPrinterA(
 3     LPCTSTR pszPrinter
 4 );
 5 BOOL
 6 WINAPI SetDefaultPrinterW(
 7     LPCTSTR pszPrinter
 8 );
 9 #ifdef UNICODE
10 #define SetDefaultPrinter SetDefaultPrinterW
11 #else
12 #define SetDefaultPrinter SetDefaultPrinterA
13 #endif // !UNICODE

  至此,我们就可以通过调用SetDefaultPrinter()函数,设置系统的默认打印机了。比如,我们想要将虚拟打印机TinyPDF设置为系统默认打印机,可以通过以下代码实现:

::SetDefaultPrinter("TinyPDF");

【打印技术01】获取及设置系统默认打印机相关推荐

  1. 打印技术之获取及设置系统默认打印机

    http://www.cnblogs.com/menlsh/p/4189126.html 本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用En ...

  2. 【VC++技术杂谈002】打印技术之获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 1.获取系统中的所有打印机 获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地.网络打印机信息.其函数原型为: 1 ...

  3. java打印设置_java如何设置系统默认打印机

    4.完整代码 import javax.print.*; import javax.print.attribute.*; import java.io.*; public class Printing ...

  4. Android调用系统默认打印机并反射获取打印任务状态

    Android4.4通过PrintManger调用系统默认打印服务的默认打印机进行打印任务,并通过反射调用PrintManager的getPrintJob方法获取打印任务状态.不说太多,直接上代码.第 ...

  5. Android 使用反射机制获取或设置系统属性(SystemProperties)

    网上有很多介绍,但是感觉比较混乱!由于自己能力有限,只做一些简单易懂的介绍. 一.获取和设置SystemProperties属性的代码 下面是通过反射来获取和设置系统属性的代码 public fina ...

  6. Android : 反射机制获取或设置系统属性(SystemProperties)

    Android.os.SystemProperties 提供了获取和设置系统属性的方法,但是这个类被隐藏了,应用开发时无法直接访问,可以通过反射的机制进行操作. 获取系统属性 public stati ...

  7. 设置linux默认音频设备,Ubuntu18.04设置系统默认音频设备:使用pavucontrol命令

    一.环境介绍 操作系统:  虚拟机运行的Ubuntu18.04  64位 二.解决的问题 情况说明: 当前ubuntu18.04上有多个声卡设备,两个麦克风(1个USB声卡带的麦克风.1个内置麦克风) ...

  8. Windows中获取和设置系统日期时间的C程序

    In this C program, we have to set, get the system's date and time. 在此C程序中,我们必须设置,获取系统的日期和时间. To get, ...

  9. android 11.0 12.0第三方输入法app设置系统默认输入法

    1.概述 在11.0 12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置 输入法的相关功能需求,然后根据输入法包名来设置默认输入法 2.第三方输入法app设置 ...

最新文章

  1. 服务器架设笔记——httpd插件支持mysql字符集选择
  2. linux 系统tar文件压缩打包命令
  3. Python 实现快排、堆排
  4. [18]Debian Linux Install GNU GCC Compiler and Development Environment
  5. Log4j的简单配置使用
  6. Android studio SweetAlert for Android
  7. python程序员自我介绍范文_程序员的自我介绍|史上最有趣的版本
  8. JS的内建函数reduce
  9. pyqt5优秀项目python_Python优秀开源项目Rich源码解析
  10. dp-整数划分问题(理论分析)
  11. 图片轮播html原生代码,原生js实现轮播图的示例代码
  12. opencv模板匹配matchTemplate
  13. Anaconda重装后【系统找不到指定的路径】
  14. document 常用事件
  15. 页面加载数学公式,mathjax转html
  16. 声音均衡器怎么调好听_均衡器调节(人声处理)
  17. 单片机c语言编写一个时钟程序,单片机基于c语言编写时钟.doc
  18. 【LTspice】009 低通、高通、带通滤波器
  19. Spring Boot配置ssl证书
  20. xen html挂件桌面不显示,桌面图标不显示

热门文章

  1. 电感指标对LC滤波电路的影响
  2. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和, 例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
  3. 计算机图形学的研究意义
  4. 2019 谷歌开发者大会, 参会记录
  5. 粒子动画,做礼物,雪花等特效
  6. 基于STM32的智能小车(一)
  7. 细数原生 Android 4.2 系统的细节缺陷
  8. SAP 系统输入记忆功能如何恢复
  9. L24数据库二——4mongo示例1
  10. PS2022版绿色精简版安装扩展面板显示未经正确签署的解决方法