Estoy poniendo el código que permite listar los trabajos de la cola de impresión de Windows.
Este código lo he probado en win2k Profesional +SP4, compilándolo con Delphi 6
En este ejemplo retorno solo el formato de JOB_INFO_2 para los trabajos, pero hay otros mas, el ejemplo debería servir para los otros formatos simplemente cambiando los tipos y algunas modificaciones sencillas.
Unidades necesarias:
Printers , WinSpool,SysUtils,Types
Pasos Y Explicacion de Uso:
1- Recuperar el hander de la impresora:
la funcion getHandlePrinter(PrinterNumber:word):THandle; realiza este trabajo llamando a la función de API32 OpenPrinter.
2- Recupero los trabajos de la cola de impresión:
la función getJobsInfo2(HandleIMP); llama a EnumJobs() dos veces.
La primera ves: envía la estructura enumJobInfo_2: TPArrayJOB_INFO_2; con con tamaño de 1000 bytes.
Si EnumJobs() falla (OkJobs=false) este retorna en jobNeeded el tamaño de bytes necesarios para almacenar todos los trabajos en la estructura enumJobInfo_2:TPArrayJOB_INFO_2 para luego poder llamar a EnumJobs() por 2da ves y que esta retorne los trabajos en enumJobInfo_2.
La cantidad de trabajos es retornado en JobReturned.
Tipos que tuve que definir:
Código:
const
MAXJobs=1000
type
TArrayJOB_INFO_2 = array [0..MAXJobs] of JOB_INFO_2;
TPArrayJOB_INFO_2 =^TArrayJOB_INFO_2;
function getHandlePrinter(PrinterNumber:word):THandle;
Código:
function getHandlePrinter(PrinterNumber:word):THandle;
var
Defaults : TPRINTERDEFAULTS;
NombreImpresora : string;
Ok : boolean;
MangoPrinter : THandle;
begin
try
NombreImpresora := Printer.Printers.Strings[PrinterNumber];
{Eliminamos el "on LPT"}
if Pos(' on ',NombreImpresora)<>0 then
NombreImpresora:=Copy (NombreImpresora,1,Pos(' on ',NombreImpresora)-1);
Defaults.DesiredAccess := PRINTER_ALL_ACCESS;
Defaults.pDatatype := nil;
Defaults.pDevMode := nil;
Ok := OpenPrinter(PChar(NombreImpresora), MangoPrinter, @Defaults);
if (Ok)
then getHandlePrinter:=MangoPrinter
else raise Exception.create('OpenPrinter no pudo recuperar el Handle de la impresora '+NombreImpresora);
except
end;
end;
procedure getJobsInfo2(Handle:THandle);
Código:
procedure getJobsInfo2(Handle:THandle);
var
enumJobInfo_2 :TPArrayJOB_INFO_2;
JobInfoNumer :DWord;
JobInfo : JOB_INFO_2;
JobNeeded :DWORD;
JobReturned :DWORD;
jobId :Dword;
okJobs :boolean;
begin
GetMem(enumJobInfo_2,1000);
JobInfoNumer:=2;
OkJobs :=EnumJobs(Handle,0,MAXJobs ,JobInfoNumer,enumJobInfo_2,1000,JobNeeded,JobReturned);
if not OkJobs then
begin
FreeMem(enumJobInfo_2);
GetMem(enumJobInfo_2, JobNeeded);
OkJobs :=EnumJobs(Handle,0,MAXJobs,JobInfoNumer,enumJobInfo_2,JobNeeded,JobNeeded,JobReturned);
end;
end;