2。1。2监测当前打印机状态
  Windows标准的打印机监测程序。通过该程序,我们可以了解当前打印机的状态,包括打印机任务队列,
  各项任务状态、所有者、进度和开始时间,并且可以及时暂停、清除打印任务。

监控打印机就有必要对Windows后台打印机制有所了解。后台程序可以减轻应用程序的打印负担。Windows在启动时就加载后台
  打印程序。因此,当应用程序开始打印时,它已经是活动的了。当程序打印一个文件时,GDI模块创建打印的数据文件。后台
  打印程序的任务是将这些文件发往打印机。GDI模块发出一个消息来通知它开始一个新的打印作业。然后打印机开始读文件,
  并将文件传送到打印机。为了传送打印文件,后台程序为打印机所连接的并口和串口提供各种通信函数。在后台程序向打
  印机发送文件操作结束的命令后,它就删除包含输出数据的临时文件。

后台打印程序的组合。
  ----------------------------------------
  打印请求后台程序     | 将数据流传递给打印机
  本地打印提供者       | 为本地打印机创建后台文件
  网络打印提供者       | 为网络打印机创建后台文件。
  打印处理程序         | 将后台的设备无关数据转换为特定打印机的格式
  端口监视程序         | 控制连接打印机的端口
  语言监视程序         | 控制双向通信的打印机,配置并检测打印机的状态

使用后台打印程序,真正的文件打印操作是后台打印程序的任务,而不是应用程序的任务。
  我们可以暂停打印作业、改变作业的优先级或者取消打印作业。这种管理方式使得应用程序
  可能比下面的这种情况“打印”得更快。即作业以实时方式打印,且必须等到打印完一页后
  才能处理下一页。

但是如果我们拥有更好的打印机软硬件或者在网络打印机等某些特殊的情况下,可以去掉Windows后台打印程序。
  去掉Windows后以中打印程序可以加快打印速度。因为打印输出不必保存在硬盘上,而可以直接输出到打印机,并被
  外部硬件或软件后台程序所接受。

实现类似Windows打印监测试程序的功能,需要调用Win32假脱机(SPOOL)枚举API函数。"[使用Win32假脱机枚举函数需要调用
  两次所需的函数。这些API函数通常要填充一组结构。但是,这些结构通常包含指向字符串和其他类型数据的指针。
  这些外来的数据必须存储在返回的内存中,使得字符串和其他数据存储在结构中。所以简单的在堆栈中声明一组结构变量
  不足以为API函数返回的信息设置足够的内存。]"

因此,正确的函数调用是:首先调用API函数确定需要的内存空间,在随后的调用中传入一个指针,该指针指向了一块动态
  分配的大小合适内存空间。需要进行该类处理的枚举函数包括:
  EnumForms(),EnumJobs(),EnumMonitors(),EnumPorts(),EnumPrinterDrivers(),EnumPrinters()和EnumPrinterProcessors()

下面这段程序,使用EnumJobs()API函数,枚举出所选打印机当前的打印任务。关于其他打印监控函数的使用大家可以参考
  微软平台SDK中关于打印函数和打印假脱机枚举函数的文档。

注意:独占设备是指在一个程序(作业、用户)的整个运行其间独占的设备,直到该程序(作业、用户)完成。系统的独占设备是
  有限的(譬如一台计算机只能连接一台打印机),往往不能满足多进程的要求,会引起大量进程由于等待某些独占设备而阻塞,
  成为系统的“瓶颈”。另一方面,申请到独占设备的进程在其整个运行期间虽然占有设备,利用率却常常很低,设备还是经常
  处于空闲状态。为了解决这种矛盾,最常用的方法就是用共享设备来模拟独占设备,从而提高系统地效率和设备利用率.这种
  技术称为虚拟设备技术.实现这一技术的软、硬件系统被称为假脱机(Simultaneous Peripaheral Operation On Line SPOOL)
  系统。打印机是典型的独占设备。引入SPOOL技术后,用户的打印请求传递给SPOOL系统,而不是真正的把打印机分配给用户。
  SPOOL系统的输出进程是先磁盘上申请一个空闲区域,把需要打印的数据传输到里面,再把用户的打印请求挂到打印机队列上。
  如果打印机空闲,就会从打印机队列中取出一个打印请求,再从磁盘上的指定区域取出数据,执行打印操作。由于磁盘是共享
  的,SPOOL系统可以随时响应打印请求并把数据缓存起来,这样独占设备改造成了共享设备,从而提高了设备的利用率和系统
  利用率。

/*
   OpenPrinter
   Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"(ByVal pPrinterName As String,phPrinter As Long,
   pDefault As PRINTER_DEFAULTS)As Long

说明:
   打开指定的打印机,并获取打印机的句柄。
   返回值:
   Long,非零表示成功,零表示失败。会设置GetLastError
   参数表:
   pPrinterName  String,要打开的打印机的名字
   phPrinter     Long,用于装载打印机的句柄。
   pDefault      PRINTER_DEFAULT,这个结构保存要载入的打印机信息。
   */
   /*
   Declare Function EnumJobs Lib "winspool.drv"Alias "EnumJobsA"(ByVal hPrinter As Long,
   ByVal First Job As Long,ByVal NoJobs As Long,ByVal Level As Long,pJob As Byte,ByVal cdBuf As Long
   ,pcbNeeded As Long,pcReturned As Long)As Long

说明:
   枚举打印队列中的作业
   返回值:
   Long,非零表示成功,零表示失败。 可以通过GetLastError获取错误信息。
   hPrinter:  Long,一个已打开的打印机对象的句柄(用OpenPrinter获得)
   FirstJob:  Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始)
   NoJobs     Long,要枚举的作业数量。
   Level      Long,1或2
   pJob       Byte,包含JOB_INFO_1或JOB_INFO_2结构的缓冲区
   cbBuf      Long,pJob缓冲区中的字符数量。
   pcbNeeded  Long,指向一个LONG型变量的指针,该变量用于保存请求的缓冲区长度
              或者实际读入的字节数量。
   pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数)。
   */
   /*
   GetLastError
   Declare Function GetLastError lib "kernel32"Alias "GetLastError"As Long
   说明:
   针对之前调用的api函数,用这个函数取得扩展错误信息
   返回值:Long,由api函数决定.请参考api32.txt文件,其中列出了一系列错误常数;都以ERROR_前
   缀起头.常用的错误代码见下表:
   ERROR_INVALID_HANDLE:无效的句柄作为一个参数传递。
   ERROR_CALL_NOT_IMPLEMENTED  在win95下调用专为win nt设计的win32 api函数
   ERROR_INVALID_PARAMETER   函数中有个参数不正确。
   */
   /*
   EnumJobs
   Declare Function EnumJobs Lib "winspool.drv" alias "EnumJobsA"(ByVal hPrinter As Long,ByVal FirstJob As Long,ByVal NoJobs As Long,By Level As Long
   pJob As Byte,ByVal cdBuf As Long,pcbNeeded As Long,pcReturned As Long) As Long

说明:
   枚举打印队列中的作业
   返回值:
   Long,非零表示成功,零表示失败。可以通过GetLastError获取错误信息
   参数表:
   hPrinter         Long,一个已打开的打印机对象的句柄(用OpenPrinter获得)
   FirstJob         Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始)
   NoJobs           Long,要枚举的作业数量。
   Level            Long,1或2
   pJob             Byte,包含JOB_INFO_1或JOB_INFO_2结构的缓冲区。
   cbBuf            Long,pJob缓冲区中的字符数量。
   pcbNeeded        Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数。
   pcbReturned      Long,载入缓冲区的结构数量。
   */

BOOL CPrintListDlg::PrintJobList(LPCTSTR szPrintName)
   {
    HANDLE   hPrinter;
    DWORD    dwNeeded,dwReturned,i;
    JOB_INFO_1  *pJobInfo;

if(!OpenPrinter(szPrinterName,&hPrinter,NULL))
     return FALSE;
    if(EnumJobs(hPrinter,0,0xFFFFFFFF,NULL,1,NULL,0,&dwNeeded,&dwReturned))
    {
     if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
     {
      ClosePrinter(hPrinter);
      return FALSE;
     }
    }
    if((pJobInfo = (JOB_INFO_1*)malloc(dwNeeded)) == NULL)
    {
     ClosePrinter(hPrinter);
     return FALSE;
    }
    if(!EnumJobs(hPrinter,0,0xFFFFFFFF,1,(LPBYTE)pJobInfo,dwNeeded,&dwNeeded,&dwReturned))
    {
     ClosePrinter(hPrinter);
     free(pJobInfo);
     return FALSE;
    }
    ClosePrinter(hPrinter);
   
    for(UINT i = 0; i < dwReturned; i++)
    {
     m_listBox2.AddString(pJobInfo[i].pDocument);
    }
    free(pJobInfo);
    return TRUE;
   }
   void CPrintListDlg::OnSelchangePrinters()
   {
    int nIndex = m_listBox.GetCurSel();
    CString strPrinterName;
    if(nIndex != CB_ERR)
    {
     m_listBox.GetText(nIndex,strPrinterName);
     if(strPrinterName.IsEmpty())
     {
      PrintJobList((LPCTSTRstrPrinterName));
     }
    }
   }
   /*
   这个例子启发我们,应用打印枚举API函数可以对打印机进行有效的监控。
   */

转载于:https://www.cnblogs.com/scud001/archive/2010/05/12/1734027.html

2.1.2监测当前打印机状态相关推荐

  1. Android官方开发文档Training系列课程中文版:电池续航时间优化之检查与监测坞的状态与类型

    原文地址:http://android.xsoftlab.net/training/monitoring-device-state/docking-monitoring.html Android设备可 ...

  2. Zabbix-3.0.X 监测服务器硬盘IO状态

    Zabbix-3.0监测服务器硬盘IO状态 一.环境准备 被监控主机已安装zabbix-agent,且zabbix-server能正常监控到zabbix-agent相关数据. 系统环境: Zabbix ...

  3. 打印系统开发(39)——检查打印机状态

    public class Printer {/// <summary> /// 构造函数 /// </summary> /// <param name="nam ...

  4. C#获取打印机状态(1)——System.Management

    C#中获取打印机状态,以下是一个操作实例: 需要添加引用System.Management,已封装成Printer类: public class Printer{/// <summary> ...

  5. NQA、Track联动监测ISP链路状态

    1.NQA基本概念 1. 测试组 NQA测试组是一组测试参数的集合,如测试类型.测试目的地址.测试目的端口等.NQA测试组由一个管理员名称和一个操作标签来标识.管理员通过NQA测试组来实现对NQA测试 ...

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

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

  7. python win32print txt_Python Win32Print打印机状态混乱

    我一直在使用Python的win32print模块来尝试获取有关打印机组的各种信息,例如驱动程序名称,作业计数,正在使用的端口,状态等.它大部分都是成功的,但是我遇到了很多麻烦充分利用win32pri ...

  8. c 语言获取系统时间并打印机,C获取打印机状态API函数详解.docx

    C获取打印机状态API函数详解 using System;using System.Collections.Generic;using System.ComponentModel;using Syst ...

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

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

最新文章

  1. 【linux基础】CMake如何生成动态链接库文件
  2. VSCode中Flow报错解决
  3. Node.js 部署免费/自动续订 HTTPS
  4. android存到手机内存,android保存文件到手机内存
  5. hdu-5707-Combine String
  6. Android群英传笔记——摘要,概述,新的出发点,温故而知新,能够为师矣!
  7. RESTFULL 03 rest-framework视图
  8. 出现在嵌入式DSP上可用于实现各种编解码器
  9. AirDisk创建网盘
  10. 【哼歌检索】十大语音搜索应用服务
  11. 预充电电路工作原理_预充电阻和预充继电器的工作原理和功用是什么?
  12. 2021有什么好的入耳式耳机推荐?耳机热销性价比牌子排行榜单推荐!
  13. 实现多余文字显示省略号
  14. 英伟达账号为什么登录不了_n卡的geforce experience登录不了怎么办?
  15. 联想小新pro16和thinkbook16p nx选哪个好
  16. 高级变量类型 ------- 列表、元组、字典
  17. Python3.x 标准模块库目录(下篇)
  18. Harris Corner
  19. 【数据仓库】现代数据仓库坏了吗?
  20. SandStorm Pack#3 建设者高光时刻

热门文章

  1. 手写webpack系列一:了解认识loader-utils
  2. SqlServer高级特性--存储过程
  3. 《中国人工智能学会通讯》——4.27 电子数据取证理论与技术
  4. 网络名称空间 实例研究 veth处于不同网络的路由问题
  5. [转]Java加密算法
  6. Silverlight数据加载时,等待图标显示与隐藏(Loading)
  7. Oracle中的date与timestamp
  8. 喜讯,公司换宽屏液晶显示器了
  9. [JAVA]deep copy链表
  10. myeclipse 删除历史工作空间记录