Hi,
I need a code That Monitors Printed Jobs by events not By using Polling Method........The Code What i have now Uses Polling Method that code is as Follow........
#include "stdafx.h"
#include <windows.h>
#include <winerror.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
#include <tchar.h>
#define MAX_PRINTERS 256
#define dwFlags PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL
int main(int argc, char * argv[])
{
HANDLE hPrinter[MAX_PRINTERS];
DWORD pcbNeeded=0,pcReturned=0,dwBytesNeeded=0,dwReturned=0;
JOB_INFO_2 * pJobInfo = NULL;
PRINTER_INFO_4 * pinfo4 = NULL;
int previous[MAX_PRINTERS], i =0;
SYSTEMTIME st;
LPWSTR fp;
HANDLE handle;
DWORD s = 0;
char NO_OF_COPIES = 0;
TCHAR msg[142];
DWORD NO_OF_PRINTS = NULL;
DWORD NO_OF_BYTES = NULL;
handle = CreateFile(L"D:\\PrinterDatabase.txt",FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer ( handle, 1, 0, FILE_BEGIN );
for (i=0; i<MAX_PRINTERS; i++)
{
previous[i]=0;
}
while ( !EnumPrinters (dwFlags, NULL, 4, (LPBYTE) pinfo4, dwBytesNeeded,
&dwBytesNeeded, &dwReturned) )
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (pinfo4)
LocalFree (pinfo4);
pinfo4 = (PRINTER_INFO_4 *) LocalAlloc (LPTR, dwBytesNeeded);
}
else
{
MessageBoxW(NULL, L"EnumPrinters failed: ", L"INFO", MB_ICONWARNING);
return 1;
}
}
printf("\n*******************************************************\n\n");
printf("# OF PRINTERS (Local/Networked) INSTALLED ON YOUR MACHINE = %lu\n",
dwReturned);
printf("\n Press any key if you want to quit\n\n");
for (i = 0; i < (int)dwReturned; i++)
{
if ( !OpenPrinter( pinfo4[i].pPrinterName, (LPHANDLE)&hPrinter[i],
(LPPRINTER_DEFAULTS)NULL) )
{
MessageBoxW (NULL, L"OpenPrinter failed", L"INFO", MB_ICONWARNING);
return 1;
}
}
while (!kbhit())
{
for(i=0; i<(int)dwReturned; i++) {
while ( !EnumJobs((HANDLE)hPrinter[i], 0, 1, 2, (LPBYTE)pJobInfo,
pcbNeeded, (LPDWORD)&pcbNeeded, (LPDWORD)&pcReturned) )
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (pJobInfo) LocalFree(pJobInfo);
pJobInfo = (JOB_INFO_2 *) LocalAlloc(LPTR, pcbNeeded);
}
else
{
MessageBoxW (NULL, L"EnumJobs on printer failed ", L"INFO", MB_ICONWARNING);
goto Cleanup;
}
}
if (pcReturned > 0) {
if ((int)pJobInfo->JobId != previous[i])
{
char *Statement = "\r\n**********************************PRINTER INFORMATION *****************************";
WriteFile ( handle, Statement, strlen ( Statement ) + 28, &NO_OF_BYTES, NULL );
char *Jobid = "\r\nJOBID :";
char Jobinfo_ID[5] = {0};
itoa ( pJobInfo->JobId, Jobinfo_ID, 10 );
WriteFile ( handle, Jobid, strlen(Jobid) , &NO_OF_BYTES, NULL );
WriteFile ( handle, LPCTSTR(Jobinfo_ID), strlen ( Jobinfo_ID ), &NO_OF_BYTES, NULL );
char *PrinterName = "\r\r\nPrinter Name :";
WriteFile ( handle, PrinterName, strlen ( PrinterName ), &NO_OF_BYTES, NULL );
WriteFile ( handle, (pJobInfo->pPrinterName), strlen ( (char *)(pJobInfo->pPrinterName) ) + 56 , &NO_OF_BYTES, NULL );
char *MachineName = "\r\nMachineName :";
WriteFile ( handle, MachineName, strlen ( MachineName ), &NO_OF_BYTES, NULL );
WriteFile ( handle, pJobInfo->pMachineName, strlen ( (char *)(pJobInfo->pMachineName) ) + 25, &NO_OF_BYTES, NULL );
char *UserName = "\r\nUserName :";
WriteFile ( handle, UserName, strlen ( UserName ), &NO_OF_BYTES, NULL );
WriteFile ( handle, pJobInfo->pUserName, strlen ( (char *)(pJobInfo->pUserName) ) + 12, &NO_OF_BYTES, NULL );
char *DocumentName = "\r\nDocumentName :";
WriteFile ( handle, DocumentName, strlen ( DocumentName ), &NO_OF_BYTES, NULL );
WriteFile ( handle, pJobInfo->pDocument, strlen ( (char *)(pJobInfo->pDocument) ) + 58, &NO_OF_BYTES, NULL );
if(pJobInfo->pDevMode->dmFields & DM_COPIES)
itoa (pJobInfo->pDevMode->dmCopies, &NO_OF_COPIES, 10);
char *Copies = "\r\nNo Of Copies :";
WriteFile ( handle, Copies, strlen ( Copies ), &NO_OF_BYTES, NULL );
char dmCopies[3] = {0};
itoa ( pJobInfo->pDevMode->dmCopies, dmCopies, 10 );
WriteFile ( handle, dmCopies, strlen (dmCopies) + 2, &NO_OF_BYTES, NULL );
if (handle != INVALID_HANDLE_VALUE)
MessageBoxW (NULL,L"file creation Success ",L"info",MB_OKCANCEL);
else
MessageBoxA (NULL,"file creation failed ","info",MB_ICONWARNING);
GetLocalTime (&st);
char date[20] = {0};
char Month[4] = {0};
itoa ( st.wMonth, Month, 10 );
char Day[4] = {0};
itoa ( st.wDay, Day, 10 );
char Year[6] = {0};
itoa ( st.wYear, Year, 10 );
strcat ( date, Month );
strcat ( date, "-");
strcat ( date, Day );
strcat ( date, "-");
strcat ( date, Year );
char *dated = "\r\nDate :";
WriteFile ( handle, dated, strlen( dated ) , &NO_OF_BYTES, NULL );
WriteFile ( handle, date, strlen ( date ) + 6, &NO_OF_BYTES, NULL );
char Time[20] = {0};
char Minute[4] = {0};
itoa ( st.wMinute, Minute, 10 );
char Seconds[4] = {0};
itoa ( st.wSecond, Seconds, 10 );
char hour[6] = {0};
itoa ( st.wHour, hour, 10 );
strcat ( Time, hour );
strcat ( Time, ":");
strcat ( Time, Minute );
strcat ( Time, ":");
strcat ( Time, Seconds );
char *Timed = "\r\nTime :";
WriteFile ( handle, Timed, strlen ( Timed ), &NO_OF_BYTES, NULL );
WriteFile ( handle, Time, strlen ( Time ) + 6, &NO_OF_BYTES, NULL );
printf("\n Press any key if you want to quit\n\n");
}
}
}
}
getch ();
Cleanup :
LocalFree (pinfo4); LocalFree (pJobInfo);
for (i=0; i< (int)dwReturned; i++){
if ( !ClosePrinter( (HANDLE)hPrinter[i] ) )
{
MessageBoxW (NULL , L"ClosePrinter failed", L"INFO", MB_ICONWARNING);
return 1;
}
}
return 0;
}