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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82224.shtml
英文地址,請注明出處:http://en.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…