Ver Mensaje Individual
  #5  
Antiguo 21-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - Espańa
Posts: 18.275
Reputación: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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;

    // No ghay trabajos en cola?
    if (numJobs = 0) Then begin
      Exit;
    end
    else begin
      i:= Pred(numJobs);
      TotalPages := pJ^[i].TotalPages;
      CurrentPage := pJ^[i].Position;
    end; // if

  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;

    // No hay trabajos en cola?
    if numJobs = 0 Then
      // Nada
    else begin

      // Para todos los trabajos
      For i:= 0 to Pred(numJobs) Do begin
        Cont := Cont + 1;
      end; // for
    end; // if

  finally

    Result := Cont;
    ClosePrinter( hPrinter );
  end;

end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita