当前位置: 首页 > news >正文

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

背景:

“遍历当前用户的每一台虚拟打印机,将其默认纸张设置为 A4 并设置为纵向。”

实现原理:

1.从当前用户的注册表读取所有已配置的打印机;
2.遍历每台打印机;
3.输出其逻辑与实际纸张大小;
4.尝试设置为 A4 纸,纵向;
5.输出设置是否成功。

#include <Windows.h>
#include <stdio.h>void SetPrinterPaperSizeAndOrientation(HANDLE hPrinter, int nPaperIndex, int nOrientation)
{DEVMODE devMode;memset(&devMode, 0, sizeof(DEVMODE));devMode.dmSize = sizeof(DEVMODE);// 获取当前打印机的设备模式if (DocumentProperties(NULL, hPrinter, NULL, &devMode, NULL, DM_OUT_BUFFER) != IDOK){// 获取设备模式失败return;}// 修改纸张大小和方向devMode.dmPaperSize = nPaperIndex; // 设置纸张大小devMode.dmOrientation = nOrientation; // 设置纸张方向// 更新打印机的设备模式if (DocumentProperties(NULL, hPrinter, NULL, &devMode, &devMode, DM_IN_BUFFER | DM_OUT_BUFFER) != IDOK){// 更新设备模式失败return;}// 获取逻辑高度和实际高度int nLogicHeight = devMode.dmPelsHeight; // 逻辑高度int nActualHeight = devMode.dmYResolution; // 实际高度
}// 获取打印机纸张信息
void GetPrinterPaperInfo(const TCHAR* pszPrinterName, int& nLogicalWidth, int& nLogicalHeight, int& nPhysicalWidth, int& nPhysicalHeight)
{HKEY hKey;LONG lResult;// 构造打印机注册表项路径TCHAR szKeyPath[MAX_PATH];_stprintf_s(szKeyPath, _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\%s\\PrinterDriverData"), pszPrinterName);// 打开打印机注册表项lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyPath, 0, KEY_READ, &hKey);if (lResult == ERROR_SUCCESS){TCHAR szData[MAX_PATH];DWORD dwDataSize = sizeof(szData);// 获取逻辑纸张宽度lResult = RegQueryValueEx(hKey, _T("PaperWidth"), NULL, NULL, (LPBYTE)szData, &dwDataSize);
if (lResult == ERROR_SUCCESS)
{// 正确处理数据printf("Value data: %s\n", szData);
}
else if (lResult == ERROR_MORE_DATA)
{printf("Buffer size too small\n");
}
else if (lResult == ERROR_INVALID_PARAMETER)
{printf("Invalid parameter\n");
}
else
{printf("Error querying default registry value: %d\n", lResult);
}if (lResult == ERROR_SUCCESS){sscanf_s(szData, "%d", &nLogicalWidth);}// 获取逻辑纸张高度lResult = RegQueryValueEx(hKey, _T("PaperHeight"), NULL, NULL, (LPBYTE)szData, &dwDataSize);if (lResult == ERROR_SUCCESS){sscanf_s(szData, "%d", &nLogicalHeight);}// 获取实际纸张宽度lResult = RegQueryValueEx(hKey, _T("PaperWidthActual"), NULL, NULL, (LPBYTE)szData, &dwDataSize);if (lResult == ERROR_SUCCESS){sscanf_s(szData, "%d", &nPhysicalWidth);}// 获取实际纸张高度lResult = RegQueryValueEx(hKey, _T("PaperHeightActual"), NULL, NULL, (LPBYTE)szData, &dwDataSize);if (lResult == ERROR_SUCCESS){sscanf_s(szData, "%d", &nPhysicalHeight);}RegCloseKey(hKey);}
}int main()
{HKEY hKey;LONG lResult;DWORD dwIndex = 0;TCHAR szPrinterName[MAX_PATH];DWORD dwSize = sizeof(szPrinterName);// 打开打印机列表注册表项lResult = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices"), 0, KEY_READ, &hKey);if (lResult == ERROR_SUCCESS){// 遍历打印机列表while (RegEnumKeyEx(hKey, dwIndex, szPrinterName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){int nLogicalWidth = 0; // 逻辑纸张宽度int nLogicalHeight = 0; // 逻辑纸张高度int nPhysicalWidth = 0; // 实际纸张宽度int nPhysicalHeight = 0; // 实际纸张高度// 获取打印机纸张信息GetPrinterPaperInfo(szPrinterName, nLogicalWidth, nLogicalHeight, nPhysicalWidth, nPhysicalHeight);// 输出获取的纸张信息printf("Printer Name: %s\n", szPrinterName);printf("Logical Paper Size: %d x %d\n", nLogicalWidth, nLogicalHeight);printf("Physical Paper Size: %d x %d\n", nPhysicalWidth, nPhysicalHeight);// 重置打印机名称缓冲区大小dwSize = sizeof(szPrinterName);dwIndex++;}RegCloseKey(hKey);}return 0;
}
http://www.xdnf.cn/news/639091.html

相关文章:

  • 【Siggraph Asia 2023】低光增强Diffusion-Low-Light-main(引入diffusion与DWT) -- part1论文精读
  • AutoGen SelectorGroupChat 示例:社会热搜话题事件榜单
  • 成功解决ImportError: cannot import name ‘DTensor‘ from ‘torch.distributed.tensor‘
  • 选择排序算法研究
  • 【NIPS 2024】Towards Robust Multimodal Sentiment Analysis with Incomplete Data
  • C++异步(1)
  • [Protobuf] 快速上手:安全高效的序列化指南
  • SymAgent:一种用于知识图谱复杂推理的神经符号自学Agent框架
  • Oracle中的[行转列]与[列转行]
  • 【目标检测】【医学图像目标检测】BGF-YOLO:脑肿瘤检测的多尺度注意力特征融合
  • 【linux】systemctl基本语法
  • 康佳Java开发面试题及参考答案
  • 前端vue3实现图片懒加载
  • 【LCEL深度解析】LangChain表达式语言的工程化实践指南
  • 基于stm32单片机的智能盲杖研究
  • # YOLO11解决方案之区域追踪探索
  • Python 数据类型方法(1)
  • Docker 一键部署倒计时页面:Easy Countdown全设备通用
  • 2025年5月18日蓝桥stema省选拔赛答案解析
  • GDB调试工具详解
  • 探索高效视频下载:一款绿色版工具的实用体验
  • FreeRTOSConfig.h的作用
  • Three.js 海量模型加载性能优化指南
  • CMake指令:find_package()在Qt中的应用
  • C# 深入理解类(索引器)
  • Disruptor—3.核心源码实现分析一
  • 黑马点评-分布式锁Lua脚本
  • 在线热更新 Upstream全面掌握 ngx_http_upstream_conf_module
  • 华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • HTTP 和 HTTPS 的区别