1. 程式人生 > >VC 獲取印表機與列印作業的狀態

VC 獲取印表機與列印作業的狀態

#pragma comment(lib, "winspool.lib")
#include "stdafx.h"
#include <winspool.h>

#ifndef _MAX_PATH

#define _MAX_PATH 260

#endif

TCHAR m_tchPrinterMessage[_MAX_PATH];///< 列印結果的返回資訊

/// 獲取列印作業的狀態
BOOL GetJobs(HANDLE hPrinter,

    JOB_INFO_2 **ppJobInfo,
    int *pcJobs,           
    DWORD *pStatus)        

{

 DWORD       cByteNeeded, nReturned, cByteUsed;
 JOB_INFO_2          *pJobStorage = NULL;
 PRINTER_INFO_2       *pPrinterInfo = NULL;

 
 if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
 {
  DWORD dwErrorCode = ::GetLastError();
  if (dwErrorCode != ERROR_INSUFFICIENT_BUFFER)
   return FALSE;
 }

 pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
 if (!(pPrinterInfo))
  
  return FALSE;

 
 if (!GetPrinter(hPrinter,
  2,
  (LPBYTE)pPrinterInfo,
  cByteNeeded,
  &cByteUsed))
 {
  
  free(pPrinterInfo);
  pPrinterInfo = NULL;
  return FALSE;
 }

 
 if (!EnumJobs(hPrinter,
  0,
  pPrinterInfo->cJobs,
  2,
  NULL,
  0,
  (LPDWORD)&cByteNeeded,
  (LPDWORD)&nReturned))
 {
  if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
  {
   free(pPrinterInfo);
   pPrinterInfo = NULL;
   return FALSE;
  }
 }

 pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
 if (!pJobStorage)
 {
  
  free(pPrinterInfo);
  pPrinterInfo = NULL;
  return FALSE;
 }

 ZeroMemory(pJobStorage, cByteNeeded);

 
 if (!EnumJobs(hPrinter,
  0,
  pPrinterInfo->cJobs,
  2,
  (LPBYTE)pJobStorage,
  cByteNeeded,
  (LPDWORD)&cByteUsed,
  (LPDWORD)&nReturned))
 {
  free(pPrinterInfo);
  free(pJobStorage);
  pJobStorage = NULL;
  pPrinterInfo = NULL;
  return FALSE;
 }

 
 *pcJobs = nReturned;
 *pStatus = pPrinterInfo->Status;
 *ppJobInfo = pJobStorage;
 free(pPrinterInfo);

 return TRUE;

}

/// 檢測印表機的狀態
/// hPrinter表示印表機Handle
BOOL CheckPrinterStatus(HANDLE hPrinter)

{
 BOOL bResult = PRINT_NOT_EXIST;
 if(NULL == hPrinter)
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機不存在!"));
  return bResult;
 }
 bResult = PRINT_FALSE;

 JOB_INFO_2  *pJobs;
 int         cJobs,i;
 DWORD       dwPrinterStatus;

 
 if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("列印失敗!"));
  return bResult;
 }

 //
 //if (dwPrinterStatus &
 // (PRINTER_STATUS_ERROR |     //打印出錯
 // PRINTER_STATUS_PAPER_JAM |        //卡紙
 // PRINTER_STATUS_PAPER_OUT |
 // PRINTER_STATUS_PAPER_PROBLEM |   //列印紙出現問題
 // PRINTER_STATUS_OUTPUT_BIN_FULL |  //列印輸出已滿
 // PRINTER_STATUS_NOT_AVAILABLE |   //印表機不可用
 // PRINTER_STATUS_NO_TONER |    //沒有墨粉
 // PRINTER_STATUS_OUT_OF_MEMORY |   //列印記憶體出錯
 // PRINTER_STATUS_OFFLINE |    //未聯機
 // PRINTER_STATUS_DOOR_OPEN))    //印表機的門是開的
 //{
 // free( pJobs );
 // _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
 // return bResult;
 //}

 /// 正在列印
 if(dwPrinterStatus & PRINTER_STATUS_PRINTING)
 {
  _tcscpy(m_tchPrinterMessage,_TEXT("正在列印..."));
  bResult = PRINT_GOING;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAUSED)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印暫停中..."));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_BUSY)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機繁忙,/n被臨時佔用"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_WAITING)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印等待中..."));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_SERVER_OFFLINE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("未連線印表機伺服器"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_ERROR)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_JAM)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機卡紙"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_OUT)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印紙位置不正確"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_PAPER_PROBLEM)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印紙出現問題"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OUTPUT_BIN_FULL)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印輸出已滿"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_NOT_AVAILABLE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機不可用"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_TONER_LOW)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機墨粉不足"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_NO_TONER)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機沒有墨粉"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OUT_OF_MEMORY)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("列印記憶體溢位"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_OFFLINE)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("無法連線印表機,\n可能是印表機未啟動"));
  return bResult;
 }
 else if(dwPrinterStatus & PRINTER_STATUS_DOOR_OPEN)
 {
  free( pJobs );
  _tcscpy(m_tchPrinterMessage,_TEXT("印表機的門是開著的,\n請關閉"));
  return bResult;
 }

 
 for (i = 0; i < cJobs; ++i)
 {
  /// 如果列印頁正在列印
  if (pJobs[i].Status & JOB_STATUS_PRINTING)
  {
   _tcscpy(m_tchPrinterMessage,_TEXT("正在列印..."));
   
   if (pJobs[i].Status &
    (JOB_STATUS_ERROR |
    JOB_STATUS_OFFLINE |
    JOB_STATUS_PAPEROUT |
    JOB_STATUS_BLOCKED_DEVQ))
   {
    free( pJobs );
    _tcscpy(m_tchPrinterMessage,_TEXT("打印出錯!"));
    return bResult;
   }
  }
  ///// 如果列印頁已經列印或刪除
  //if(pJobs[i].Status &
  // (JOB_STATUS_PRINTED|
  //  JOB_STATUS_DELETED))
  //{
  // free( pJobs );
  // ::ClosePrinter(m_hPrintHandle);
  // return PRINT_END;
  //}
  /// 如果列印頁已經列印
  if(pJobs[i].Status & JOB_STATUS_PRINTED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   _tcscpy(m_tchPrinterMessage,_TEXT("列印成功!"));
   bResult = PRINT_TRUE;
   return bResult;
  }
  /// 如果已經刪除列印作業
  else if(pJobs[i].Status & JOB_STATUS_DELETED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   _tcscpy(m_tchPrinterMessage,_TEXT("已取消列印"));
   bResult = PRINT_TRUE;
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_PAUSED)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印作業暫停..."));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_ERROR)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印作業出錯"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印作業離線"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_SPOOLING)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印作業離線"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_OFFLINE)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印作業未連線"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_PAPEROUT)
  {
   free( pJobs );
   ::ClosePrinter(m_hPrintHandle);
   bResult = PRINT_FALSE;
   _tcscpy(m_tchPrinterMessage,_TEXT("列印紙位置不正確"));
   return bResult;
  }
  else if(pJobs[i].Status & JOB_STATUS_BLOCKED_DEVQ)
  

相關推薦

VC獲取印表機列印作業狀態

VC 獲取印表機與列印作業的狀態#pragma comment(lib, "winspool.lib")#include "stdafx.h"#include <winspool.h>#ifndef _MAX_PATH#define _MAX_PATH 260#

VC 獲取印表機列印作業狀態

#pragma comment(lib, "winspool.lib") #include "stdafx.h" #include <winspool.h> #ifndef _MAX_PATH #define _MAX_PATH 260 #endif TCHAR m_tchPrinte

VC印表機程式設計之兩篇有用的文章獲取印表機列印作業狀態和設定印表機模式並預覽列印

VC印表機程式設計之兩篇有用的文章 vc設定印表機模式並預覽列印   呼叫列印屬性對話方塊: if(::OpenPrinter("Adobe PDF", &hPrint, NULL)) {::PrinterProperties(m_hWnd, hPrint);::

獲取印表機連線狀態列印任務是否錯誤

HANDLE   PrnHandle;        if   (OpenPrinter("EPSON Stylus Photo R270 Series",&PrnHandle,NULL))        {           unsigned    char

獲取系統的網絡狀態無線網的信號強度

con connect pre fault 下載 target .profile dep 名稱 一臺電腦,有時通過有線網連接網絡(調制解調器/局域網),如有網卡也可連接wifi。那麽如何獲取WLAN是否連接,和相應的信號強度呢? 就以下倆點: 獲取電腦連網狀態 獲取無線網

系統分析設計第六次作業--狀態建模

1)使用 UML State Model 建模物件: 參考 Asg_RH 文件, 對 Reservation/Order 物件建模。 建模要求: 參考練習不能提供足夠資訊幫助你對訂單物件建模,請參考

win7 印表機狀態正常無法列印的解決方法(更新補丁後印表機無法列印的解決方法)

win7 印表機狀態正常無法列印的解決方法(更新補丁後印表機無法列印的解決方法): 經過測試 印表機是日常辦公過程中非常重要的裝置。有些win7旗艦版使用者在Windows Update更新補丁後,

本地印表機獲取以及檔案列印 java

選擇相應的檔案進行列印 //列印檔案的選擇 JFileChooser fileChooser = new JFileChooser(); //建立列印作業 int state = fileChooser.showOpenDialo

Android標籤印表機連線列印位置調動方法總結

一、獲取連線的標籤列印裝置private static List<UsbDevice> deviceList;private static String deviceArrayLisr;private static UsbDevice mUSBDevice;pub

VC++實現IPARP資訊獲取,可以同理實現APR攻擊

ARP(Address Resolution Protocol,地址解析協議)是獲取實體地址的一個TCP/IP協議。某節點的IP地址的ARP請求被廣播到網路上後,這個節點會收到確認 其實體地址的應答,這樣的資料包才能被傳送出去。RARP(逆向ARP)經常在無盤工作站上使用,以

獲取印表機當前的狀態

 /// <summary>         /// 獲取印表機的當前狀態         /// </summary>         /// <param name="PrinterDevice">印表機裝置名稱</param&

VC獲取子執行緒入口函式的退出碼(分別由CreateThread,_beginthread,_beginthreadexAfxbeginThread 建立的子執行緒 )

       在 VC 程式設計中,若是涉及到多執行緒程式設計時,有時我們也需要根據情況獲取子執行緒入口函式的退出碼,以便根據具體的程式執行情況做相應的處理。        之前我在使用 VC 開發程式時,也遇到過需要獲取子執行緒入口函式的退出碼的問題,由於起初沒有做過

vc++獲取網頁源碼

port 初始化 .html blank 控制 target 對象 請求 獲取網頁 1. 獲取網頁源碼的步驟: com組件的初始化 創建WinHttpRequest對象 創建並實例化WinHttpRequest組件 調用Open方法打開連接 調用Send方法發送請求 使用

Java設計模式-狀態模式

維護 chan str else 開關 進行 private 接下來 csdn 概念:狀態模式把所研究的對象的行為包裝在不同的狀態對象裏。每個狀態對象都屬於一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候。其行為也隨之改變,也就是不同狀態相應

【設計模式Android】狀態模式——一個人的兩幅面孔

android 設計模式什麽是狀態模式 所謂狀態模式,就是當一個對象的內在轉臺改變時允許改變其行為,這個對象看起來就像是改變了其類的設計模式。狀態模式和策略模式都是為具有多種可能情形設計的模式,兩者的結構幾乎完全一樣,但狀態模式的行為是平行且不可替換的,而策略模式的行為則是彼此獨立的。換句話說就是:狀態模式將

【API】獲取系統內存所有狀態

base 系統 sizeof minimum address sea sha regions info SYSTEM_INFO sysInfo = {0}; GetSystemInfo(&sysInfo); DWORD dwMinAddr

Storm筆記整理(三):Storm集群安裝部署Topology作業提交

大數據 實時計算 Storm [TOC] Storm分布式集群安裝部署 概述 Storm集群表面類似Hadoop集群。但在Hadoop上你運行的是”MapReduce jobs”,在Storm上你運行的是”topologies”。”Jobs”和”topologies”是大不同的,一個關鍵不同是

第六章應用程序的安裝管理作業

rpm1、查看自己的主機名,並把自己的主機名修改為test.example.com(修改配置文件)2、用命令把主機名改為aa.example.com(要求永久生效)3、用配置文件修改自己的IP地址,改為172.16.30.10,子網掩碼255.255.255.0,網關地址172.16.30.1,DNS地址17

系統分析設計——作業3

uml border table log str mage 網上 body src 1、用例建模 a.閱讀 Asg_RH 文檔,繪制用例圖。 按 Task1 要求,請使用工具 UMLet,截圖格式務必是 png 並控制尺寸 b.選擇你熟悉的定旅館在線服務系統(或移動

系統分析設計——作業5

閱讀 nbsp 圖片 模型 png .com AS 數據 領域建模 1、 領域建模 a. 閱讀 Asg_RH 文檔,按用例構建領域模型。 領域模型: b. 數據庫建模(E-R 模型) (1)系統的 E-R 模型(數據邏輯模型): (2)導出 Mysql 物理數據庫