设为首页 收藏本站
查看: 1340|回复: 0

[经验分享] Windows下监控打印机,获取打印任务信息

[复制链接]

尚未签到

发表于 2015-12-15 15:47:24 | 显示全部楼层 |阅读模式
/************
本文档功能是对打印机进行监控,获取本地所有打印机名称,并根据打印机名称对打印机进行监控,实时获取打印机的打印任务信息。
*************/
#include iostream
#include  stdio.h
#include  stdlib.h
#include  string.h
#include  windows.h
#include  process.h
#include  time.h
#include  fstream
#include  io.h
#include  direct.h









using namespace std;


#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")


#define PRINTER_NUM5
static char printer[PRINTER_NUM][256];//暂时最大可监控本地上的5个打印机
#definePRINT_INFO_FILE"print_info.xml"


//遍历电脑中的打印机
void get_all_printer_device()
{
    DWORD            dwFlags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL;     
    LPPRINTER_INFO_2 pPrinters;     
    DWORD            cbPrinters;     
    DWORD            cReturned, i;  
    char             buf[256];  
      
    EnumPrinters (dwFlags, NULL, 2, NULL, 0, &cbPrinters,     
        &cReturned);     
      
    if (!(pPrinters = (LPPRINTER_INFO_2) LocalAlloc (LPTR, cbPrinters + 4)))     
    {     
        ::MessageBox (NULL, "error",     
            "error", MB_OK | MB_ICONEXCLAMATION);     
         
    }     
      
    if (!EnumPrinters (dwFlags, NULL, 2, (LPBYTE) pPrinters,     
        cbPrinters, &cbPrinters, &cReturned))     
    {     
        ::MessageBox (NULL, "error",     
            "error", MB_OK | MB_ICONEXCLAMATION);     
    }     
      
    if (cReturned > 0)     
    {  
         
        for (i = 0; i < cReturned; i++)     
        {     
            // for each printer in the PRINTER_INFO_2 array: build a string that     
            //   looks like "DEVICE_NAME;PORT;DRIVER_NAME"      
if(i <= PRINTER_NUM-1){
strcpy(printer,(pPrinters+i)->pPrinterName);
}
             //printf("printer name:%s\n",(pPrinters+i)->pPrinterName);
//printf("printer portname:%s\n",(pPrinters+i)->pPortName);
#if 0
            strcpy (buf, (pPrinters + i)->pPrinterName);     
            strcat (buf, ";");     
            strcat (buf, (pPrinters + i)->pPortName);     
            strcat (buf, ";");     
            strcat (buf, (pPrinters + i)->pDriverName);     
#endif
        }        
    }  
    else     
        ::MessageBox (NULL, "No printers listed", "PRINTER.EXE", MB_OK);
}
//获取系统默认打印机
void GetSystemDefaultPrinter()
{
char szBuff[1024] = {0};
DWORD len = 1024;
int ret;


ret = GetDefaultPrinter(szBuff,&len);
if(ret == FALSE){
printf("getdefault printer error:%d\n",GetLastError());
return ;
}
printf("default printer:%s\n",szBuff);
return;
}


//获取本机的IP地址(一个网卡)
static string GetLocalIpAddress()
{
WORD wVersionRequested = MAKEWORD(2,2);


WSADATA wsaData;
if(WSAStartup(wVersionRequested,&wsaData) != 0){
return "";
}


char local[255] = {0};
gethostname(local,sizeof(local));
hostent *ph = gethostbyname(local);
if(ph == NULL)
return "";
in_addr addr;
memcpy(&addr,ph->h_addr_list[0],sizeof(in_addr));


string localIP;
localIP.assign(inet_ntoa(addr));


WSACleanup();
return localIP;
}

/*****************
函数名称:monitor_printer_ex
描述:打印机监控线程,根据打印机名称对打印机进行监控,当打印机上有打印任务时,获取打印任务的文档名,打印主机名,打印者名称,打印份数,打印时间等信息
参数:
lpParameter打印机名称,通过遍历打印机获取


***************/
unsigned int __stdcall monitor_printer_ex(PVOID lpParameter)
{
HANDLE printerHandle;
HANDLE chgObject;\
DWORD nByteNeeded;
DWORD nReturned;
DWORD nByteUsed;
BOOL fcnreturn;
DWORD dwChange;
int i;
char *lpPrinterName;
string str;
time_t tm;


PRINTER_DEFAULTS Defaults = { NULL, NULL, PRINTER_ALL_ACCESS};
lpPrinterName = (char *)lpParameter;
//if(!OpenPrinter(lpPrinterName,&printerHandle,NULL)){
if(!OpenPrinter(lpPrinterName,&printerHandle,&Defaults)){
printf("open printer failed\n");
return 0;
}
chgObject = FindFirstPrinterChangeNotification(printerHandle,PRINTER_CHANGE_JOB,0,NULL);
while(1){
WaitForSingleObject(chgObject,INFINITE);
fcnreturn = FindNextPrinterChangeNotification(chgObject,&dwChange,NULL,NULL);
if(fcnreturn){
if(dwChange == PRINTER_CHANGE_ADD_JOB){
//printf(" %s printer add new job\n",lpPrinterName);
#if 1
//通过调用GetPrinter()函数得到作业数量
PRINTER_INFO_2 *pPrinterInfo = NULL;
GetPrinter(printerHandle,2,NULL,0,&nByteNeeded);
pPrinterInfo = (PRINTER_INFO_2 *)malloc(nByteNeeded);
GetPrinter(printerHandle,2,(LPBYTE)pPrinterInfo,nByteNeeded,&nByteUsed);

// 通过调用EnumJobs()函数枚举任务
JOB_INFO_2 *pJobInfo = NULL;
EnumJobs(printerHandle,0,pPrinterInfo->cJobs,2,NULL,0,(LPDWORD)&nByteNeeded,(LPDWORD)&nReturned);
pJobInfo = (JOB_INFO_2 *)malloc(nByteNeeded);
ZeroMemory(pJobInfo,nByteNeeded);
EnumJobs(printerHandle,0,pPrinterInfo->cJobs,2,(LPBYTE)pJobInfo,nByteNeeded,(LPDWORD)&nByteUsed,(LPDWORD)&nReturned);

if(pPrinterInfo->cJobs == 0){
//printf("not jobs\n");
free(pPrinterInfo);
free(pJobInfo);
//ClosePrinter(printerHandle);
//return;
continue;
}

//删除打印机上的所有任务
#if 0
for(i = 0; i < nReturned;i++){
    if(!SetJob(printerHandle,pJobInfo.JobId,2,(LPBYTE)pJobInfo,JOB_CONTROL_DELETE)){
    printf("delete job failed\n");
    cout<<"error:"<

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151682-1-1.html 上篇帖子: Windows内核编程之:分页内存与非分页内存 下篇帖子: windows C++ gbk转为utf-8
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表