http://www.cnblogs.com/menlsh/p/4189126.html

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

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");

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

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

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

  2. 【打印技术01】获取及设置系统默认打印机

    本文主要介绍如何获取以及设置系统的默认打印机. 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. java 多选列表框_快逸报表:填报中的下拉多选列表框
  2. 深度学习-语义分割总结
  3. Jmeter 多台机器产生负载及问题解决方法
  4. mysql索引分析_MySQL索引分析和优化
  5. java 不能反序列化_java中的序列化与反序列化
  6. jupyter notebook和python有什么区别_Jupyter Notebook 有哪些奇技淫巧?
  7. 比特币区块链将分道扬镳、Libra苦难继续,2020区块链进入关键时期!
  8. 美区苹果id被禁用原因和解除限制方法
  9. 微波工程(第三版)中关于史密斯圆图部分总结
  10. (rec)机器人中的语音讲话TTS引擎
  11. java开发面试 自我介绍!!!!!
  12. 十几减9的口算题_一年级数学《口算十几减9》教案
  13. 论文笔记 PCL: Proposal Cluster Learning for Weakly Supervised Object Detection - TPAMI 2018
  14. 获取屏幕分辨率和刷新率
  15. ResNet+cifar10总结-由浅入深
  16. scrum立会报告+燃尽图(第二周第三次)
  17. git push到远程仓库时出现unable to access 'https://github.com/**': The requested URL returned error: 403
  18. 雨听 | 解除在微信公众平台中绑定的微信号
  19. php英文月份,php如何实现月份转英文
  20. PTA 7-1 宿舍谁最高?(20分)

热门文章

  1. c语言能实现图片转字符画吗,图片转字符画
  2. vscode-cats插件是如何开发的?小包带你来实现一下
  3. 基础如何开始学习平面设计?——黎乙丙
  4. 2021年前端面试题总结
  5. autocad全国计算机考试试题,2017年cad等级考试试题「附答案」
  6. (转载)SDH、MSTP、OTN、PTN、IP-RAN的区别和联系
  7. javascript英语单词音节拆分_英语单词音节的划分:成音节详解
  8. IDEA 最新版找不到allow parallel run 如何打开多个控制台的解决方案
  9. linux下vim中文乱码的解决方法
  10. 携程网首页案例(flex布局)