Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Monitorear impresiones (https://www.clubdelphi.com/foros/showthread.php?t=5465)

roman 21-11-2003 19:27:36

Monitorear impresión
 
¿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:
Código Delphi [-]


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

no muestra el nº de paginas ni el Usr Name
 
Cita:

Código Delphi [-]
 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

Monitor de Impresiones en red
 
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

sisntaxis
 
esta mal tu sintaxis, por eso te envia error

Código Delphi [-]
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

Cita:

Empezado por marcoszorrilla (Mensaje 21905)
Hola Román mira yo tengo estas funciones, que la verdad no las he utilizado mucho, así que mira a ver si te interesan:


Código:

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 ??


La franja horaria es GMT +2. Ahora son las 22:44:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi