Revisa estos dos procedimientos; Los encontré hace tiempo en Internet, porque necesitaba algo similar a lo tuyo. Conultar la cola de Jobs de la impresora, para saber cuando estaba libre.
Un saludo.
Código Delphi
[-]
procedure TForm1._GetPagesLastJob(var TotalPages:Integer; var CurrentPage:Integer);
type
TJobs = Array [0..1000] of JOB_INFO_1;
PJobs = ^TJobs;
var
hPrinter : THandle;
bytesNeeded, numJobs, i: Cardinal;
pJ: PJobs;
begin
TotalPages := 0;
CurrentPage := 0;
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 begin
RaiseLastWin32Error;
end;
if (numJobs = 0) Then begin
Exit;
end
else begin
i:= Pred(numJobs);
TotalPages := pJ^[i].TotalPages;
CurrentPage := pJ^[i].Position;
end;
finally
ClosePrinter( hPrinter );
end;
end;
function TForm1._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 TForm1._EnumJobs():Integer;
type
TJobs = Array [0..1000] of JOB_INFO_1;
PJobs = ^TJobs;
var
hPrinter : THandle;
bytesNeeded, numJobs, i: Cardinal;
pJ: PJobs;
Cont:Integer;
begin
Cont := 0;
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 begin
RaiseLastWin32Error;
end;
if numJobs = 0 Then
else begin
For i:= 0 to Pred(numJobs) Do begin
Cont := Cont + 1;
end; end;
finally
Result := Cont;
ClosePrinter( hPrinter );
end;
end;