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


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

    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("
    ");
    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("
    ");
    16     strPrinterInfo += _T("打印机驱动: ") + strDriverName + _T("
    ");
    17     strPrinterInfo += _T("打印机端口: ") + strPortName + _T("
    ");
    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");
  • 相关阅读:
    Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0
    Can't connect to MySQL server on '192.168.7.175' (10060)
    单精度浮点数(float)加法计算出错
    当前不会命中断点 还没有为该文档加载任何符号
    64位程序,long*转long 出错
    当前安全设置不允许下载该文件的原因以及图文解决办法
    IndentationError: unindent does not match any outer indentation level
    MongoDB状态查询:db.serverStatus()
    bson.errors.InvalidStringData: strings in documents must be valid UTF-8
    Transformer的PyTorch实现
  • 原文地址:https://www.cnblogs.com/menlsh/p/4189126.html
Copyright © 2020-2023  润新知