PDA

Ver la Versión Completa : Monitorear impresiones


roman
21-11-2003, 19:27:36
¿Existe alguna forma en Windows 2000 de monitorear desde una aplicación Delphi cuando el usuario manda una impresión y saber cuántas hojas manda?

// Gracias

Lmas
23-11-2003, 13:14:20
Hola roman.

Que yo sepa, no existen en Windows funciones hook para monitorear la impresión, aunque tal vez se pueda hacer lo que pides por medio de un thread y con las funciones...

FindFirstPrinterChangeNotification, FindNextPrinterChangeNotification y FindClosePrinterChangeNotification

vigilar los cambios de la impresora.

Cuando haya un cambio, con EnumJobs y GetJob, obtener las páginas que se quieren imprimir.

SalU2

roman
23-11-2003, 20:00:43
Muchas gracias por la respuesta. Le voy a buscar por ahí. No he visto con detalle las funciones que me mencionas aunque parece que me permiten por lo menos detectar en qué momento se agrega un trabajo a la cola de impresión y quizá de ahí ya pueda averiguar información acerca de la impresión.

// Saludos

marcoszorrilla
23-11-2003, 22:12:02
Hola Román mira yo tengo estas funciones, que la verdad no las he utilizado mucho, así que mira a ver si te interesan:



uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Printers,WinSpool;
.....
function GetCurrentPrinterHandle: THandle;
var
Device, Driver, Port: array[0..255] of Char;
hDeviceMode: THandle;
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if not OpenPrinter(@Device, Result, nil) then
RaiseLastWin32Error;
end;

function SavePChar(p: PChar): PChar;
const
error: PChar = 'Nil';
begin
if not Assigned(p) then
Result := error
else
Result := p;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
TJobs = array [0..1000] of JOB_INFO_1;
PJobs = ^TJobs;
var
hPrinter: THandle;
bytesNeeded, numJobs, i: Cardinal;
pJ: PJobs;
begin
hPrinter := GetCurrentPrinterHandle;
try
EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded,
numJobs);
pJ := AllocMem(bytesNeeded);
if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded,
bytesNeeded, numJobs) then
RaiseLastWin32Error;

memo1.Clear;
if numJobs = 0 then
memo1.Lines.Add('No hay trabajos en la cola')
else
for i := 0 to Pred(numJobs) do
memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s',
[SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument),
pJ^[i].Status, SavePChar(pJ^[i].pStatus)]));
finally
ClosePrinter(hPrinter);
end;
end;

Un Saludo.

roman
24-11-2003, 02:07:00
Muchas gracias marcos. Da la impresión de que combinando esto con lo que me comenta Lmas puedo obtener lo que quiero, que básicamente es contabilizar el número de hojas que cada usuario de una sala de cómputo imprime.

// Saludos

Enan0
15-01-2005, 04:07:11
memo1.Lines.add(pJ^[i].pUserName);
memo1.Lines.add(inttostr(pJ^[i].TotalPages));

Agregue estas dos lineas. y el Total PAges me muestra cualquier verdura y el pUserName me imprime (VACIO)
Estoy usando W2000

seicomtko
28-06-2005, 06:12:37
FindFirstPrinterChangeNotification, FindNextPrinterChangeNotification y FindClosePrinterChangeNotification

¿Alguién me podria dar un ejemplo de como usar estas funciones?

Lo ke pasa es ke necesito hacer un programa ke monitoree las impresiones en red... osea un servidor... La idea es ke al enviar una impresion desde otro pc... el servidor pause la impresion y envie un mensaje ke diga desde ke pc lo estan enviando, la cantidad de paginas, a ke impresora, configuracion de la hoja y toda la informacion ke se pueda obtener... Gracias

david_thecid
23-10-2006, 01:28:04
esta mal tu sintaxis, por eso te envia error


mmo1.Lines.Add(Format('usuario : %s',[SavePChar(pJ^[i].pJ^[i].pUserName)]));

de sa forma te imprimiria el susuario que envi la impresion.

adonias
07-01-2008, 21:35:11
Hola Román mira yo tengo estas funciones, que la verdad no las he utilizado mucho, así que mira a ver si te interesan:



uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Printers,WinSpool;
.....
function GetCurrentPrinterHandle: THandle;
var
Device, Driver, Port: array[0..255] of Char;
hDeviceMode: THandle;
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if not OpenPrinter(@Device, Result, nil) then
RaiseLastWin32Error;
end;

function SavePChar(p: PChar): PChar;
const
error: PChar = 'Nil';
begin
if not Assigned(p) then
Result := error
else
Result := p;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
TJobs = array [0..1000] of JOB_INFO_1;
PJobs = ^TJobs;
var
hPrinter: THandle;
bytesNeeded, numJobs, i: Cardinal;
pJ: PJobs;
begin
hPrinter := GetCurrentPrinterHandle;
try
EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded,
numJobs);
pJ := AllocMem(bytesNeeded);
if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded,
bytesNeeded, numJobs) then
RaiseLastWin32Error;

memo1.Clear;
if numJobs = 0 then
memo1.Lines.Add('No hay trabajos en la cola')
else
for i := 0 to Pred(numJobs) do
memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s',
[SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument),
pJ^[i].Status, SavePChar(pJ^[i].pStatus)]));
finally
ClosePrinter(hPrinter);
end;
end;
Un Saludo.

Existe alguna manera de ver el NUMERO DE COPIAS ??