首页 > 系统相关 >Qt环境Windows应用程序动态变更系统默认打印机

Qt环境Windows应用程序动态变更系统默认打印机

时间:2024-02-16 13:33:26浏览次数:29  
标签:打印机 setPrinterName Qt lib Windows 默认 应用程序 winspool NULL

有些工作环境安装有多个打印机,针对不同需求进行各种输出。如果是用QPrinter进行打印控制,可以通过setPrinterName确定使用哪一个打印机,但如果程序使用了第三方功能进行打印输出,比如通过QAxObject调用系统的文字处理直接输出,就可能会遇到无法明确指定哪一个打印机的问题。这时就需要我们动态变更一下系统的默认打印机。
这里调用了两个windows的API函数,GetDefaultPrinterA和SetDefaultPrinterA。它们的Unicode版名称分别是GetDefaultPrinterW和SetDefaultPrinterW。
工作流程是:Get函数读取当前默认打印机,Set函数把默认打印机设定成任务所需的机器,输出完成之后再用Set函数恢复成之前的默认打印机。
根据机器软件环境,有两种方法来实现这个过程。
如果使用msvc,应该能使用静态库 winspool.lib,直接包含头文件winspool.h,正常使用这两个函数即可。但我项目使用了minGW,没有合适的静态库,只能另外从网上下载个winspool.dll,按动态库的方法来调用。
具体代码如下:

  QFile f;
  QString dllFile = QCoreApplication::applicationDirPath();    //读取项目运行路径
  dllFile.append("/winspool.dll");    //动态库文件名称
  QLibrary lib;    //
  typedef BOOL __stdcall (*pGetDefaultPrinter)(LPTSTR , LPDWORD);//定义两函数的原型
  typedef BOOL __stdcall (*pSetDefaultPrinter)(LPTSTR);//
  pGetDefaultPrinter getPrinterName = NULL;
  pSetDefaultPrinter setPrinterName = NULL;
  bool err = true;    //设置出错标志
    
  if(f.exists(dllFile) ){ //动态库文件是否存在
    lib.setFileName("winspool");    //准备装入动态库
    if(lib.load())        //动态库是装入成功
    {
      getPrinterName  = (pGetDefaultPrinter)lib.resolve("GetDefaultPrinterA");//
      setPrinterName = (pSetDefaultPrinter)lib.resolve("SetDefaultPrinterA") ;//
      if(getPrinterName != NULL && setPrinterName != NULL)    //是否成功获取函数入口
      {
        err = false;        //清除出错标志
      }
    }
  }
  if(err)
  {
    QMessageBox::information(NULL, "注意","winspool.dll 无效,将使用系统默认打印机输出!");
  }

  QSettings setIni("clin.ini", QSettings::IniFormat);
  QString newPrName = setIni.value("sk/printer").toString();    //读取当前任务需要使用的打印机名称
  QString curPrName;

  char prtName[256];  //Get函数需要的参数
  DWORD sz = 256;  //
  if(!getPrinterName((LPTSTR)prtName, (LPDWORD)&sz))        //读取系统当前默认打印机名称
  {
    QMessageBox::information(NULL, "注意","无法获取系统当前打印机名称!");
  }
  curPrName = QString(prtName);        //临时保存默认打印机

  if(!setPrinterName((LPTSTR)newPrName.toLatin1().data()))        //设置新的默认打印机
  {
    QMessageBox::information(NULL, "注意","无法修改系统当前打印机!");
  }
  //
  //进行打印输出
  //
   if(!setPrinterName((LPTSTR)curPrName.toLatin1().data()))  //恢复默认打印机
  {
    QMessageBox::information(NULL, "注意","系统当前打印机已变更,请手动改回!");
  }

标签:打印机,setPrinterName,Qt,lib,Windows,默认,应用程序,winspool,NULL
From: https://www.cnblogs.com/sundp/p/18017081

相关文章

  • Qt FluentUI 框架
    QtFluentUI框架项目地址:zhuzichu520/FluentUI(github.com)安装编译直接用QtCreator打开工程,编译运行example即可。根据CMakeLists.txt可以看出,编译好了后会自动在<Qt_SDK_DIR>/<Qt_Version>/<Your_compiler>/qml下面生成FluentUI文件夹,其中存放着FluentUI......
  • windows下c++遍历各个磁盘的所有文件,不知道为什么FindFirstFileA文件会报错,进而程序退
    下面的程序还有一些问题,比如360的一些目录就用FindFirstFileA函数打开错误;还有  C:\Windows\System32\WebThreatDefSvc ,属性只有 DIRECTORY,用函数 _access检查也没有问题,但是就是用FindFirstFileA打开的时候错误;至今没有想到解决办法,只能临时跳过这种目录。 #include......
  • 验证:web应用程序要遵循http协议
     说明webserver响应的格式必须要遵循http响应协议,否则浏览器或者其它客户端工具不能解析响应,而http请求协议已经由浏览器或者其它客户端工具帮我们封装好了。这里我们直接通过socket写一个简单的server来演示。 get请求server.pyimportsocketimporttime#创建TCP......
  • qt 代码添加QScrollArea滚动区域控件,设置滚动区域窗口widget后,滚动区域和滚动条之间有
    QScrollArea#MyqtWidgetStyle_m_scrollArea{background-color:rgb(189,97,99);max-width:190px;/*最大宽度*/min-width:190px;/*最大宽度*/}QWidget#MyqtWidgetStyle_m_scorllWidget{max-width:160px;/*最大宽度*/min-width:160px;......
  • Pycharm安装与配置Pyqt5
    1、创建一个项目、虚拟环境打开pycharm,File->Newproject2、安装pyqt5及工具库在PyCharm左下角的Terminal中输入:pipinstallPyQt5-ihttps://pypi.douban.com/simplepipinstallPyQt5-tools-ihttps://pypi.douban.com/simple 3、将QT工具添加到环境变量将其安装路......
  • Service Control Manager (SCM):Windows 自带的服务控制管理器(SCM)是一个命令行工具,用于
    ServiceControlManager(SCM):Windows自带的服务控制管理器(SCM)是一个命令行工具,用于安装、启动、停止、删除和查询系统中的服务。您可以使用sc命令来执行这些操作,以及查看服务的状态和配置。描述:    SC是用来与服务控制管理器和服务进行通信    的命令行程......
  • qt自定义标题栏,纯代码实现,拿来即用,初始化列表时传入父窗口的this指针
    //头文件#ifndefTITLEBAR_H#defineTITLEBAR_H#include<QWidget>#include<QPoint>//坐标点#include<QMouseEvent>//鼠标事件classTitleBar:publicQWidget{Q_OBJECTpublic:explicitTitleBar(QWidget*parent=nullptr);//移动窗口......
  • celery 5.3.6在windows中运行收到任务不执行
    命令:```celery-Ayour_projectworker--concurrency=2-Peventlet-linfo```1.`celery`:这是用于管理Celery任务的命令行实用程序。2.`-Ajavdb`:指定Celery应用程序实例。3.`worker`:告诉Celery启动一个工作进程。4.`--concurrency=2`:设置工作进程的数量为2。根据......
  • Mac上运行Windows程序的好方法是什么 Mac兼容虚拟机
    想要在Mac操作系统上运行Windows应用程序其实还是很简单的,只要安装一些工具就可以了。现在市面上可以实现这个功能的方法有三种,那么在Mac上运行Windows程序的好方法是什么呢?今天将为大家介绍一下这三种方式各是什么,以供大家进行参考。一、CrossOverCrossOver可以让MAC......
  • Qt6.0开发 第二章 GUI程序设计基础
    第二章GUI程序设计基础窗口相关文件按照第一章所给提示创建一个新project,我们得到了下面的代码:widget.h:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACEclassWidget:publicQWidget{......