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

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

 

1.获取系统中的全部打印机函数

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

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能够是如下标志量的组合:3d

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

  PRINTER_ENUM_NAME:枚举由参数Name指定的打印机,若是参数Name为NULL,则枚举出全部可用的打印机对象

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

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

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

  参数Name表示同本机链接的打印机。博客

  参数Level表示级别(取值为一、二、四、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");
相关文章
相关标签/搜索