【VC++技术杂谈002】打印技术之获取及设置系统默认打印机
本文主要介绍如何获取以及设置系统的默认打印机。
1.获取系统中的所有打印机
获取系统中的所有打印机可以使用EnumPrinters()函数,该函数可以枚举全部的本地、网络打印机信息。其函数原型为:
BOOL WINAPI EnumPrinters(
DWORD Flags,
LPSTR Name,
DWORD Level,
LPBYTE pPrinterEnum,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
);
其中,参数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()函数来获取系统中的所有打印机:
/*
* 函数功能 : 获取系统中所有的打印机名称
* 备 注 :
* 作 者 : 博客园 依旧淡然
*/
CString CPrintDemoDlg::GetAllPrinterName()
{
DWORD dwSize;
DWORD dwPrinters;
CString strPrintersName = _T(""); //第一次调用得到结构体的大小
::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
NULL, , NULL, , &dwSize, &dwPrinters); //第二次调用得到打印机列表
BYTE *pBuffer = new BYTE[dwSize];
::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
NULL, , pBuffer, dwSize, &dwSize, &dwPrinters); //得到所有的打印机名称
if(dwPrinters != )
{
PRINTER_INFO_5 *pPrinterInfo = (PRINTER_INFO_5 *)pBuffer;
for(int i=; i<dwPrinters; i++)
{
strPrintersName += pPrinterInfo->pPrinterName; //得到打印机名称
strPrintersName += _T("\r\n");
pPrinterInfo++;
}
}
delete []pBuffer; return strPrintersName;
}
其中,EnumPrinters()函数被调用了两次,第一次调用是为了得到结构体的大小dwSize,以便申请适当的内存空间大小,第二次调用是为了得到打印机列表。结构体PRINTER_INFO_5中的pPrinterName字段存储了打印机的名称。返回值strPrintersName保存了查找到得系统中所有打印机名称,如图1所示。
图1 当前系统中的所有打印机
这与控制面板->打印机与传真中列出的当前系统中所有打印机是一致的,如图2所示。
图2 当前系统中的所有打印机
需要注意的一点是,使用EnumPrinters()函数时,需要包含头文件winspool.h和库文件Winspool.lib,具体方法如下:
#include <winspool.h>
#pragma comment(lib, "Winspool.lib")
2.获取系统的默认打印机
由图2可以看出,在系统默认打印机(Adobe PDF)的图标上会有一个“√”符号,以示与其他非默认打印机的区别。那么我们如何通过程序来获取系统的默认打印机呢?
CPrintDialog类封装了Windows通用打印对话框,其成员函数GetDefaults()能够在打印对话框不显示的情况下获取当前打印机的缺省状态,而不需要用户的交互作用。
此外,该类还提供了一系列函数,用于获取和设置打印参数,如:
GetDeviceName(); //获取打印机名称
GetCopies(); //获取打印份数
GetFromPage(); //获取打印起始页码
GetToPage(); //获取打印结束页码
等等,我们要获取系统的默认打印机,可以使用GetDeviceName()函数来实现。如下的代码示例了如何获取打印机名称、打印机驱动名和打印机端口:
/*
* 函数功能 : 获取系统的默认打印机
* 备 注 :
* 作 者 : 博客园 依旧淡然
*/
CString CPrintDemoDlg::GetSystemDefaultPrinter()
{
CString strPrinterInfo = _T(""); CPrintDialog printDialog(FALSE); //构造打印设置对话框对象
printDialog.GetDefaults(); //获取默认打印设备的设备环境
CString strDeviceName = printDialog.GetDeviceName(); //获取当前打印机的名称
CString strDriverName = printDialog.GetDriverName(); //获取当前打印机的驱动名
CString strPortName = printDialog.GetPortName(); //获取当前打印机的端口
strPrinterInfo += _T("打印机名称: ") + strDeviceName + _T("\r\n");
strPrinterInfo += _T("打印机驱动: ") + strDriverName + _T("\r\n");
strPrinterInfo += _T("打印机端口: ") + strPortName + _T("\r\n"); return strPrinterInfo;
}
其中,返回值strPrinterInfo保存了系统默认打印机的名称、驱动名和端口。如图3所示。
图3 系统默认打印机
3.设置系统默认打印机
如果我们想要设置系统的默认打印机,又该怎么做呢?其实,使用SetDefaultPrinter()函数就可以了。但是,在使用这个函数之前,需要确认在winspool.h文件中是否对该函数进行了定义。如果没有,我们就需要在winspool.h文件中添加以下代码段:
BOOL
WINAPI SetDefaultPrinterA(
LPCTSTR pszPrinter
);
BOOL
WINAPI SetDefaultPrinterW(
LPCTSTR pszPrinter
);
#ifdef UNICODE
#define SetDefaultPrinter SetDefaultPrinterW
#else
#define SetDefaultPrinter SetDefaultPrinterA
#endif // !UNICODE
至此,我们就可以通过调用SetDefaultPrinter()函数,设置系统的默认打印机了。比如,我们想要将虚拟打印机TinyPDF设置为系统默认打印机,可以通过以下代码实现:
::SetDefaultPrinter("TinyPDF");
【VC++技术杂谈002】打印技术之获取及设置系统默认打印机的更多相关文章
- Android : 反射机制获取或设置系统属性(SystemProperties)【转】
本文转载自:https://blog.csdn.net/wei_lei/article/details/70312512 Android.os.SystemProperties 提供了获取和设置系统属 ...
- C#获取本地打印机列表,并将指定打印机设置为默认打印机
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- 如何以编程方式打印到在 MFC 中的非默认打印机
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105790245b09c0252bd7a74a2485d315d2390f0750 ...
- Delphi获取与设置系统时间格式,即GetLocaleInfo和SetLocaleInfo
在Delphi中,特别是在写管理系统软件时,经常要用到 FormatDateTime 以将 TDateTime 格式的日期时间转换成字符串形式的值显示或保存起来,或者用 StrToDateTime将字 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-1 获取和设置系统时间
使用功能块NT_GetTime,NETID填写两个单引号表示本机,START就是一个触发信号,一般的功能块都需要一个上升沿触发执行,最后的输出类型都是让系统自己决定,然后统一把这些变量放到全局变量中( ...
- 【VC++技术杂谈003】打印技术之打印机状态监控
在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...
- C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板
一.问题: 今天,我整理了一下两个问题 1.如何获取本机安装所有输入法,并设置为系统输出语言 2.如何打开搜狗拼音输入法工具栏和手写板: 二.解决方法 比如:我们要设置搜狗输入法为本机输入语言,要怎么 ...
- C# 获取或设置本地打印机及配置文件操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- 【VC++技术杂谈001】音频技术之调节音量及设置静音
本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐 ...
随机推荐
- 常用的sublime text插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- java 对List进行物理分页
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...
- Myeclipse反编译插件的安装
1.首先需要下载 jad.exe 和 jadClipse.jar 2.找到myeclipse的安装路径会有两个文件夹 3.需要新建一下文件夹 看准路径和jad.exe的位置 4.配置jadClipse ...
- BZOJ1527 : [POI2005]Pun-point
求出重心,然后把所有点关于重心极角排序,极角相同的按到重心距离从大到小排序. 按极角序依次扫描,得到相邻两个向量的夹角以及长度之比,看成字符串. 若两个字符串循环同构,则两个点集相似,KMP判断即可. ...
- T-SQL Recipes之Common Function
在我们写SQL的时候,经常会用到许多内置方法,简化了我们许多代码,也提高了效率,这篇主要总结一些常用的方法. ISNULL VS COALESCE VS NULLIF 在SQL中,NULL值是比较特殊 ...
- 关于php-fpm子进程达到上限并且浏览器访问显示504错误
今天上班遇到一个非常奇怪的事情,公司监控服务器之前都是在正常运行,使用nginx+php-fpm,并且监控服务器上部署这其他部门在使用的几个站点,从早上上班开始发现监控显示页面打不开,各种查找原因,最 ...
- 忽略this的后果
昨天在做一个简单的遮罩功能,说简单不如说是繁琐的好,主要是因为一个页面中有将近十几个,只不过是功能是一样的,要将一段文字遮盖住,文字的内容是不确定的,也就是跟着内容的高度变化而改变遮罩层的高度.了解了 ...
- 遍历datatable的方法
+方法一:DataTable dt = dataSet.Tables[0];for(int i = 0 ; i < dt.Rows.Count ; i++){string strName = d ...
- Windows多线程多任务设计初步(转)
Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...
- CentOS 6.5 安全加固及性能优化 (转)
通过修改CentOS 6.5 的系统默认设置,对系统进行安全加固,进行系统的性能优化. 环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5- ...