RT
UP没分!

解决方案 »

  1.   

    这是我以前做的
    监控能做到
    但是没有楼主说的得到其中颜色
    楼主参考
    ==============================
    procedure TForm2.Timer1Timer(Sender: TObject);
    Function AbreImpresoraPorDefecto: THandle;
       const
         Defaults:
           TPrinterDefaults = ( pDatatype : nil;
                                pDevMode  : nil;
                                DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER );
       var
         Device, Driver, Port : array[0..255] of char;
         hDeviceMode: THandle;
       begin
         Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
         if not OpenPrinter(@Device, Result, @Defaults) then Sysutils.RaiseLastWin32Error;
       end; type
       TTrabajos = array [0..9000] of JOB_INFO_1;
       PTrabajos = ^TTrabajos; var
         Device : array[0..cchDeviceName-1] of Char;
         Driver : array[0..MAX_PATH-1] of Char;
         Port : array[0..32]of Char;
         hDMode : THandle;
         pDMode : PDevMode;
         MangoPrinter      : Thandle;
         PTrabajo          : PTrabajos;
         BytesRecibidos    : DWord;
         TrabajosRecibidos : DWord;
         i                 : integer;
         papercolor        : string;
         papersize         : string;
    begin
        SetWindowLong(application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
        Form1.Label6.Caption:='当前的时间是:'+Datetimetostr(now);
        MangoPrinter:=AbreImpresoraPorDefecto;
        try
          {Hallamos cuantos bytes ocupara la enumeracion de trabajos}
          EnumJobs( MangoPrinter,0,9000,1,Nil,0,
                    BytesRecibidos,
                    TrabajosRecibidos );      {Reservamos memoria para la respuesta}
          PTrabajo := AllocMem( BytesRecibidos );
          try
            {Enumeramos los trabajos}
            if NOT EnumJobs( MangoPrinter,
                      0,           //Empezando por el primero
                      9000,        //Numero de jobs a enumerar
                      1,
                      PTrabajo,
                      BytesRecibidos,
                      BytesRecibidos,
                      TrabajosRecibidos) then SysUtils.RaiseLastWin32Error;
             if ((TrabajosRecibidos)=0) then
             with DataModuleADO.ADOQuery1 do
              begin
                SQL.Clear;
                SQL.Add('delete from PrMon where PrintNumber=:PrintNumber');
                Parameters.ParamByName('PrintNumber').Value:='0';
                ExecSQL;
              end else
            if((TrabajosRecibidos)>0) then
            begin
            //Memo1.Lines.Clear;
            Printer.GetPrinter(Device,Driver,Port,hDMode);
            if hDMode<>0 then
            begin
            pDMode:=GlobalLock(hDMode);
            end
            else pDMode:=nil;
            if pDMode <> nil then
            begin
            pDMode.dmFields := pDMode.dmFields or dm_Color;
            pDMode.dmColor := DMCOLOR_COLOR;
            GlobalUnlock(hDMode);
            end;
            case pDMode^.dmPaperSize of
              DMPAPER_USER: showmessage('纸张类型:自定义');
              DMPAPER_A3: papersize:='A3';
              DMPAPER_A4: papersize:='A4';
              DMPAPER_A5: papersize:='A5';
              DMPAPER_B4: papersize:='B4';
              DMPAPER_B5: papersize:='B5';
              DMPAPER_LETTER: papersize:='letter';
              DMPAPER_9X11: papersize:='9X11';
              DMPAPER_10X11 :papersize:='10X11 ';
              DMPAPER_15X11:papersize:='15X11';
              DMPAPER_A4_EXTRA :papersize:='A4_EXTRA ';
              DMPAPER_A4_TRANSVERSE:papersize:='A4_TRANSVERSE';
              DMPAPER_A5_TRANSVERSE:papersize:='A5_TRANSVERSE';
              DMPAPER_B5_TRANSVERSE:papersize:='B5_TRANSVERSE';
              DMPAPER_A3_EXTRA:papersize:='A3_EXTRA';
              DMPAPER_A5_EXTRA :papersize:='A5_EXTRA ';
              DMPAPER_B5_EXTRA:papersize:='B5_EXTRA';
              DMPAPER_A2 :papersize:='A2';
              DMPAPER_A3_TRANSVERSE:papersize:='A3_TRANSVERSE';
              DMPAPER_A3_EXTRA_TRANSVERSE:papersize:='A3_EXTRA_TRANSVERSE';
            else papersize:='Others';
            end;
            case Printer.Canvas.Font.Color of
              clBlack: papercolor:='Black';
              clMaroon: papercolor:='Maroon';
              clGreen : papercolor:='Green';
              clOlive: papercolor:='Olive';
              clNavy: papercolor:='Navy';
              clPurple: papercolor:='Purple';
              clTeal: papercolor:='Teal';
              clGray: papercolor:='Gray';
              clSilver: papercolor:='Silver';
              clRed: papercolor:='red';
              clYellow: papercolor:='Yellow';
              clBlue: papercolor:='Blue';
              clWhite: papercolor:='White';
              clNone: papercolor:='None';
              clDefault: papercolor:='Default';
            else papercolor:= 'Others';
            end;        for i:= 0 to Pred(TrabajosRecibidos) do
            try
              with DataModuleADO.ADOQuery1 do
              begin
                SQL.Clear;
                SQL.Add('delete from PrMon where DocumentName=:DocumentName or PrintNumber=:PrintNumber');
                Parameters.ParamByName('DocumentName').Value:=STRPAS(PTrabajo^[i].pDocument);
                Parameters.ParamByName('PrintNumber').Value:='0';
                ExecSQL;
              end;          with DataModuleADO.ADOQuery1 do
              begin
                SQL.Clear;
                SQL.Add('insert into PrMon (DocumentName,ComputerName,PrinterName,UserName,PrintNumber,PaperSize,DocumentColor,Copies,PrintDate)'+
                       'values (:DocumentName,:ComputerName,:PrinterName,:UserName,:PrintNumber,:PaperSize,:DocumentColor,:Copies,:PrintDate)');
                Parameters.ParamByName('DocumentName').Value:=STRPAS(PTrabajo^[i].pDocument);
                Parameters.ParamByName('ComputerName').Value:=STRPAS(PTrabajo^[i].pMachineName);
                Parameters.ParamByName('PrinterName').Value:=STRPAS(PTrabajo^[i].pPrinterName);
                Parameters.ParamByName('UserName').Value:=STRPAS(PTrabajo^[i].pUserName);
                Parameters.ParamByName('PrintNumber').Value:=InttoStr(PTrabajo^[i].TotalPages);
                Parameters.ParamByName('PaperSize').Value:=papersize;
                Parameters.ParamByName('DocumentColor').Value:=papercolor;
                Parameters.ParamByName('Copies').Value:=(pDmode^.dmCopies);
                Parameters.ParamByName('PrintDate').Value:=now;
                ExecSQL;
              end;          Except
              MessageDlg('入库出错',mtError,[mbok],0);
              end;
            end;
          finally
            {Liberamos la memoria usada en la respuesta}
            FreeMem( PTrabajo );
          end;
        finally
          {Cerramos la impresora}
          ClosePrinter(MangoPrinter);
        end;end;