背景:
采用Qt的QPrinterInfo可获取到可用的打印机,同时使用QPrinter设置打印的纸张,单位,方向等信息,在正常连接打印机和纸张正确放置的情况下可以实现打印功能,开发所用的打印机为MITSUBISHI P95DW,当打印机无纸,离线或者关闭等其他异常情况下,Qt所获取到的打印机依然是IDLE状态了,无法获取到打印机真实的异常状态。
调试思考:

1.所用打印机弹出了Paper Empty的窗口,所以就想到用钩子获取到该窗口,并根据内容得到具体的异常内容,钩子的方法参见

https://blog.csdn.net/fzuim/article/details/53692135https://blog.csdn.net/fzuim/article/details/53692135

,但是遗憾的是,当Windows桌面系统没有启用时,打印机的异常弹出窗口并没有产生。所以此方案行不通。
2.按照一般思路,Windows系统应该是捕捉了打印机通过驱动上发的异常消息,所以应该有API能够有这些功能。通过网络查找发现了EnumPrinters的函数,通过函数名可知是枚举打印机的,那么自然而然就能够有其他的函数能够找到获取打印机状态的函数了。
https://docs.microsoft.com/en-us/windows/win32/printdocs/enumprinters
结果:

通过查找和阅读文档中相对应的函数,找到了获取当前打印机状态的函数如:
OpenPrinter
GetPrinter
参数设置不同可以获取到不同级别的打印机当时的状态内容,本文使用的级别是2,对应到的结构体为
PRINTER_INFO_2;利用获取到的结构体的字段就可以知道对应的打印机状态
typedef struct _PRINTER_INFO_2 {
  LPTSTR               pServerName;
  LPTSTR               pPrinterName;
  LPTSTR               pShareName;
  LPTSTR               pPortName;
  LPTSTR               pDriverName;
  LPTSTR               pComment;
  LPTSTR               pLocation;
  LPDEVMODE            pDevMode;
  LPTSTR               pSepFile;
  LPTSTR               pPrintProcessor;
  LPTSTR               pDatatype;
  LPTSTR               pParameters;
  PSECURITY_DESCRIPTOR pSecurityDescriptor;
  DWORD                Attributes;
  DWORD                Priority;
  DWORD                DefaultPriority;
  DWORD                StartTime;
  DWORD                UntilTime;
  DWORD                Status;
  DWORD                cJobs;
  DWORD                AveragePPM;
} PRINTER_INFO_2, *PPRINTER_INFO_2;

代码如下,可用作参考

    HANDLE hPrinter;DWORD dwNeeded, dwReturne;wchar_t wBuffer[256] = { 0 };std::wstring wStr = m_pQPrinter->printerName().toStdWString();wmemcpy_s(wBuffer, 256, wStr.c_str(), wStr.size());LPWSTR lpw = wBuffer;if (!OpenPrinter(lpw, &hPrinter, NULL)){return;}if (!GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded)){if (GetLastError() != ERROR_INSUFFICIENT_BUFFER){ClosePrinter(hPrinter);return;}}PRINTER_INFO_2  * pPrinterInfo = (PRINTER_INFO_2  *)GlobalAlloc(GPTR, dwNeeded);if (!pPrinterInfo){//分配内存失败ClosePrinter(hPrinter);return;}if (!GetPrinter(hPrinter, 2, (LPBYTE)pPrinterInfo, dwNeeded, &dwReturne)){ClosePrinter(hPrinter);//delete pJobInfo;GlobalFree((HGLOBAL)pPrinterInfo);return;}QString printStatus;switch (pPrinterInfo->Status){case PRINTER_STATUS_PAPER_OUT: {printStatus = QString(QObject::tr("Printer paper out")); }break;case PRINTER_STATUS_OFFLINE:{printStatus = QString(QObject::tr("Printer offline"));}break;case PRINTER_STATUS_PAUSED: {printStatus = QString(QObject::tr("Printer paused")); }break;case PRINTER_STATUS_ERROR: {printStatus = QString(QObject::tr("Printer error")); }break;case PRINTER_STATUS_PENDING_DELETION:break;case PRINTER_STATUS_PAPER_JAM: {printStatus = QString(QObject::tr("Printer pager jam")); }break;case PRINTER_STATUS_PAPER_PROBLEM: {printStatus = QString(QObject::tr("Printer pager problem")); }break;case PRINTER_STATUS_BUSY: {printStatus = QString(QObject::tr("Printer busy")); }break;case PRINTER_STATUS_PRINTING: {printStatus = QString(QObject::tr("Do printing")); }break;case PRINTER_STATUS_OUTPUT_BIN_FULL:break;case PRINTER_STATUS_NOT_AVAILABLE: {printStatus = QString(QObject::tr("Printer not available")); }break;case PRINTER_STATUS_WAITING: {printStatus = QString(QObject::tr("Printer waiting")); }break;case PRINTER_STATUS_OUT_OF_MEMORY: {printStatus = QString(QObject::tr("Printer out of memory")); }break;case PRINTER_STATUS_DOOR_OPEN: {printStatus = QString(QObject::tr("Printer door open")); }break;default: {ClosePrinter(hPrinter); return; }break;}ClosePrinter(hPrinter);

Qt/Windows 获取 MITSUBISHI P95DW 打印机状态信息相关推荐

  1. FreeRTOS任务相关API函数---查询/改变某个任务的优先级+获取全部/某个任务状态信息

    本文是<ALIENTEK STM32F429 FreeRTOS 开发教程>第十一章学习笔记 第一章笔记–FreeRTOS简介与源码下载 第二章笔记–FreeRTOS在STM32F4上移植 ...

  2. 【Android工具】更新安卓手机传感器信息获取工具Ampere Castro phyphox,轻松获取硬件数据和状态信息...

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 上次分享过一个安卓手机传感器信息获取工具--Castro(本文下边),这个软件没有充电 ...

  3. 【Android工具】安卓手机轻松获取硬件数据和状态信息

    可以获取的硬件信息和软件如上图所示. 硬件中的传感器比较好玩,可以获取手机上所有传感器的数据,还能绘制出变化曲线图 总体来说功能比较多,软件界面也非常干净,就是没有移动网络信号和wifi网络信号强度的 ...

  4. Windows获取本机主机IP信息

    http://ip-api.com/json

  5. Android系统信息获取 之六:网络连接状态信息获取

    Android系统可以通过WIFI和移动网络来连接互联网,系统网络连接状态是通过ConnectivityManager 类来获取的.关键代码如下: [java] view plaincopy Conn ...

  6. 打印技术之打印机状态监控

    http://www.cnblogs.com/menlsh/p/4211988.html 在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打 ...

  7. 【打印技术02】打印机状态监控

    在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...

  8. iOS学习——获取iOS设备的各种信息

    不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...

  9. Android快递单号查询快递状态信息

    辛苦堆砌,转载请注明出处,谢谢! 今天介绍一个自己做的快递单号查询的简单APP,供大家参考.由于需要使用http和json,本文在build.gradle(module:app)添加了okhttp3依 ...

  10. vb.net 获取打印机工作状态,是否离线,打印机名称,端口号等打印机属性信息,windows 7下亲测可用

    这是vb.net 版本的,我测试了,没有问题,列出当前计算机系统中所有的打印机,列出其所有属性,网上好多人写的获取打印机状态的字段是不正确的,判断是否脱机或离线,应该选字段WorkOffline才对. ...

最新文章

  1. mysql 5.7 centos 7_CentOS 7 下 MySQL 5.7 的安装与配置
  2. stm32串口学习(一)
  3. 4个mos管驱动的全桥电路原理_最经典MOS管电路工作原理及详解没有之一
  4. Java中给循环体起别名
  5. android.os.build修改,Android的os.BuildID对应的SDK版本号以及SDK版本号与APILevel对应关系.docx...
  6. oracle用户新增数据文件,[数据库]20200722_Oracle添加表空间、用户,用户授权
  7. 【uni-app】使用定义在App.vue的方法
  8. 关于C#的强制转换和尝试转换的方法
  9. yolov5论文叫什么_熬夜写论文是一种怎样的体验
  10. (Photo Metadata Remover)Android App 一键去除照片 EXIF 隐私信息
  11. Android实现滑块拼图验证码功能
  12. 我用Python写了一个论文降重工具
  13. IP地址物理位置查询
  14. 群晖7.X关闭双重验证(OTP)的方法
  15. [Steam]成就游戏销量乐观
  16. c语言void delay是什么意思,delay是什么意思(单片机中delay)
  17. ARMv7 KVM 在 linux中的实现 3 内存角度
  18. window关闭烦人的右下角广告
  19. 微信小程序基于百度云实现图文识别(胎教级教程)
  20. numpy.logspace讲解

热门文章

  1. java中CheckException和UnCheckException的区别
  2. 机器学习:金融领域的岗位需求
  3. 微积分(四)——多元函数微分总结
  4. 【Zigbee】基础篇(4) Zigbee无线通信过程、无线发送温湿度信息
  5. WiFi语音智能家居控制系统(一)
  6. 本地上传文件至Linux虚拟机报错“复制时发生出错“
  7. win10查看所有的wifi密码。
  8. 优启通制作系统u盘_优启通u盘装系统制作工具
  9. html网页设计作品文字,40个以大文字排版的网页设计作品
  10. 潮汕“木塞”(“木虱”)概率计算