MFC:获取所有打印机的名称(打印机模块-1)

背景:

在一个 MFC 应用程序中,列出本地系统中安装的打印机,并检测是否存在“Microsoft Print to PDF”或“Microsoft XPS Document Writer”虚拟打印机。如果有,则选择其中一个作为默认或后续操作对象;如果没有,提示用户安装。

实现原理:

#include <afxwin.h> // 包含 MFC 的核心头文件
#include <winspool.h>
#include <vector>
#include <iostream>void ListPrinters()
{DWORD dwNeeded = 0;DWORD dwReturned = 0;// 获取所需缓冲区大小if (!EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 1, nullptr, 0, &dwNeeded, &dwReturned)){if (GetLastError() != ERROR_INSUFFICIENT_BUFFER){std::cerr << "EnumPrinters failed with error code: " << GetLastError() << std::endl;return;}}// 分配缓冲区std::vector<char> buffer(dwNeeded);// 获取打印机信息PRINTER_INFO_1* pPrinterInfo = reinterpret_cast<PRINTER_INFO_1*>(buffer.data());if (!EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 1, reinterpret_cast<LPBYTE>(pPrinterInfo), dwNeeded, &dwNeeded, &dwReturned)){std::cerr << "EnumPrinters failed with error code: " << GetLastError() << std::endl;return;}bool hasPdfPrinter = false;bool hasXpsPrinter = false;// 遍历打印机列表信息for (DWORD i = 0; i < dwReturned; ++i){std::wstring printerName = pPrinterInfo[i].pName;// 检查是否存在 "Microsoft Print to PDF" 打印机if (printerName == L"Microsoft Print to PDF"){hasPdfPrinter = true;}// 检查是否存在 "Microsoft XPS Document Writer" 打印机if (printerName == L"Microsoft XPS Document Writer"){hasXpsPrinter = true;}}// 根据存在的打印机情况进行选择或提示if (hasPdfPrinter){// 如果存在 "Microsoft Print to PDF" 打印机,则选择它std::wcout << L"Choosing Microsoft Print to PDF..." << std::endl;// 在这里可以执行相应的操作,如将其赋值给 CString 对象等}else if (hasXpsPrinter){// 如果存在 "Microsoft XPS Document Writer" 打印机,则选择它std::wcout << L"Choosing Microsoft XPS Document Writer..." << std::endl;// 在这里可以执行相应的操作}else{// 如果两者都不存在,则提示安装相关软件std::wcout << L"Neither Microsoft Print to PDF nor Microsoft XPS Document Writer found. Please install the required software." << std::endl;// 在这里可以执行提示用户安装软件的操作}
}// CWinApp 派生类,作为 MFC 应用程序的入口
class CMyApp : public CWinApp
{
public:virtual BOOL InitInstance() override{// 调用 ListPrinters 函数来列举打印机信息并进行选择ListPrinters();return TRUE;}
};// 声明一个 CMyApp 类的实例,作为 MFC 应用程序的入口对象
CMyApp theApp;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-行为型模式(详解)

模板方法 模板方法模式&#xff0c;它在一个抽象类中定义了一个算法(业务逻辑)的骨架&#xff0c;具体步骤的实现由子类提供&#xff0c;它通过将算法的不变部分放在抽象类中&#xff0c;可变部分放在子类中&#xff0c;达到代码复用和扩展的目的。 复用: 所有子类可以直接复…

STM32中的IIC协议和OLED显示屏

串口通信协议的缺点 串口通信通常需要至少三条线&#xff08;TX、RX和GND&#xff09;&#xff0c;而 I2C 总线仅需要两条信号线&#xff08;SDA和SCL&#xff09;&#xff1b; 串口通信仅支持一对一通信&#xff0c;而 I2C 总线支持多机通信&#xff0c;允许单个主机与多个从…

30个性能优化方案

1.用String.format拼接字符串 不知道你有没有拼接过字符串&#xff0c;特别是那种有多个参数&#xff0c;字符串比较长的情况。 比如现在有个需求&#xff1a;要用get请求调用第三方接口&#xff0c;url后需要拼接多个参数。 以前我们的请求地址是这样拼接的&#xff1a; S…

docker中部署Universal Media Server (UMS)

Universal Media Server (UMS) 本身主要是作为桌面服务程序开发的&#xff08;主要面向 Java GUI DLNA 播放&#xff09;&#xff0c;但确实可以通过 Docker 进行部署。虽然官方没有提供 Docker 镜像&#xff0c;但社区有一些可用的方式可以在 Docker 中运行它。 下面是一个可…

配置文件,xml,json,yaml,我该选哪个?

文章目录 一、核心特性对比二、性能与生态系统三、适用场景与选型建议四、替代方案与趋势五、总结 在软件开发中&#xff0c;配置文件格式的选择直接影响开发效率和维护成本。XML、JSON、YAML 是目前主流的三种格式&#xff0c;但它们各有适用场景和局限性。本文将从语法特性、…

产品迭代与放弃的判断:MVP、PMF 与 Scale Fit 的三重验证

在创业和产品管理的世界里&#xff0c;一个永恒的难题是&#xff1a;什么时候应该继续投入资源进行产品迭代&#xff1f;什么时候又该果断放弃&#xff1f; 这是一个既关乎战略方向&#xff0c;又涉及资源分配的核心命题。许多初创公司或产品团队往往在错误的方向上坚持太久&a…

DAY 35 模型可视化与推理

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&#xff0c;对比下效果。…

20250523-BUG-E1696:无法打开元数据文件“platform.winmd(已解决)

BUG&#xff1a;E1696&#xff1a;无法打开元数据文件“platform.winmd&#xff08;已解决&#xff09; 最近在用VisualStudio2022打开一个VisualStudio2017的C老项目后报了这个错&#xff0c;几经周折终于解决了&#xff0c;以下是我用的解决方法&#xff1a; 将Debug从Win32改…

Hellorobot 移动操作机器人开源实践:HPR 模型 + 全栈资源,降低家庭机器人开发门槛

Hellorobot在DobbE框架中扮演了重要的技术支柱角色。通过其尖端的模块化设计和高效算法优化&#xff0c;Hellorobot为家庭机器人领域注入了强大的创新动力。DobbE框架的核心技术——Home Pretrained Representations (HPR) 模型&#xff0c;得益于Hellorobot的技术支持&#xf…

onnx模型转入rknn3399平台上工作记录

1.rknn虚拟环境使用时报错问题 使用rknn17环境的报错&#xff1a; ImportError: libdc1394.so.22: cannot open shared object file: No such file or directory 参考链接&#xff1a;https://blog.csdn.net/2301_80032564/article/details/142316410 创作软连接&#xff1a; …

杰发科技AC7840——CSE硬件加密模块使用(1)

1. 简介 2. 功能概述 3. 简单的代码分析 测试第二个代码例程 初始化随机数 这里的CSE_CMD_RND在FuncID中体现了 CSE_SECRET_KEY在17个用户KEY中体现 最后的读取RNG值&#xff0c;可以看出计算结果在PRAM中。 总的来看 和示例说明一样&#xff0c;CSE 初次使用&#xff0c;添加…

AI要掌握的知识

AI&#xff08;人工智能&#xff09;是一个跨学科的复杂领域&#xff0c;其知识体系涵盖理论基础、技术工具和实践应用等多个层面。以下从核心知识模块、技术工具、实践方向等角度&#xff0c;详细梳理 AI 从业者需要掌握的知识体系&#xff1a; 一、数学基础&#xff1a;AI 的…

Python Click库:轻松构建优雅的命令行工具

Python Click库&#xff1a;轻松构建优雅的命令行工具 引言一、Click 适用场景二、安装 Click三、基础使用1. 第一个 Click 程序2. 添加位置参数3. 使用选项参数 四、高级功能1. 子命令分组&#xff08;多级命令&#xff09;2. 参数类型验证3. 彩色终端输出 五、实用功能示例&a…

三种常见脉冲神经网络编码方式解读

速率编码&#xff08;rate coding) 速率编码使用输入特征来确定尖峰频率&#xff0c;例如将静态输入数据&#xff08;如 MNIST 图像&#xff09;转换为时间上的脉冲&#xff08;spike&#xff09;序列。它是将神经元发放脉冲的频率与输入值&#xff08;如像素强度&#xff09;…

Selenium 测试框架 - Python

🚀Selenium Python 实战指南:从入门到进阶 Selenium 是 Web 自动化测试中最受欢迎的工具之一,支持多种浏览器和语言。本文将从环境搭建到多浏览器兼容、测试框架集成、元素定位方式、常用操作、浏览器配置等多个方面进行详细讲解,并分享常见的最佳实践建议。 📦一、环境…

第四十九节:图像分割-基于深度学习的图像分割

1. 引言 在计算机视觉领域,图像分割(Image Segmentation)是一项基础且关键的技术,其目标是将图像划分为多个具有特定语义的区域。随着深度学习技术的突破,基于神经网络的图像分割方法在精度和效率上都实现了质的飞跃。本文将重点介绍如何利用OpenCV结合深度学习模型实现高…

【GESP】C++三级真题 luogu-B4039 [GESP202409 三级] 回文拼接

GESP三级真题&#xff0c;字符串相关题目&#xff0c;难度★★✮☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-3-luogu-b4039/ 【GESP】C三级真题 luogu-B4039 [GESP202409 三级] 回文拼接 | OneCoderGESP三级真题&#xff0c;字符串相关题目&#xff0c;难…

什么是深度学习中的层次分类问题?

深度学习中的层次分类问题&#xff08;Hierarchical Classification&#xff09;是指分类任务中存在类别间的层次结构&#xff0c;且模型需要根据这种层次关系进行预测的问题。与传统的扁平分类&#xff08;Flat Classification&#xff09;不同&#xff0c;层次分类要求模型在…

黑马点评-乐观锁/悲观锁/synchronized/@Transactional

文章目录 全局ID生成器超卖乐观锁 一人一单悲观锁 当我们确认订单时&#xff0c;系统需要给我们返回我们的订单编号。这个时候就会出现两个大问题。 1.订单id采用数据库里的自增的话&#xff0c;安全性降低。比如今天我的订单是10&#xff0c;我明天的订单是100&#xff0c;那…

python下通过wmic设置程序的优先级~~~

在开发过程中&#xff0c;经常会碰到需要设置程序优先级&#xff0c;这时候可以手动到任务管理器中调整&#xff0c;但是这多多少少有些不方便&#xff0c;那么这时候我们就可以通过subprocess调用wmic命令来实现&#xff0c;方法如下: step 1 必要的引用: import subprocess…