用GetPrinter这个Win32 API,使用PRINTER_INFO_2结构参数,就可以取回打印机状态。

解决方案 »

  1.   

    uses winspool;...//调用函数 EnumJobs() 枚举打印作业,然后用GetJob()得到作业信息,再判断...//大概是这样,我也没有试过。
      

  2.   

    看下面的这个例程。还有测试代码。uses WinSpool; 
    type JOB_INFO_1_ARRAY = Array of JOB_INFO_1; 
    Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY; 
    var 
             i : Integer; 
             hPrinter   : THandle; 
             bResult    : Boolean; 
             cbBuf      : DWORD; 
             pcbNeeded  : DWORD; 
             pcReturned : DWORD; 
             aJobs      : Array[0..99] of JOB_INFO_1; 
    begin 
             cbBuf := 1000;          bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil); 
             if NOT bResult then begin 
                ShowMessage('Error opening the printer'); 
                exit; 
             end;          bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned); 
             if NOT bResult then begin 
                ShowMessage('Error Getting Jobs information'); 
                exit; 
             end;          for i:=0 to pcReturned-1 do begin 
                 if aJobs[i].pDocument <> Nil then begin 
                    SetLength(Result, Length(Result)+1); 
                    Result[Length(Result)-1] := aJobs[i]; 
                 end; 
             end; 
    end; 测试例子:
    1- 创建工程有 StringGrid 和一个 Timer. 
    2- StringGrid 'ColCount' and “RowCount” 值为 20
    3- Timer的 “Interval” 属性值 500. 
    4- “OnTime” 实践中写这个代码
    procedure TForm1.Timer1Timer(Sender: TObject); 
    var 
              i, ii : Integer; 
              aJobs : JOB_INFO_1_ARRAY; 
    begin 
              for i:=0 to StringGrid1.ColCount-1 do 
                  for ii:=0 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,ii] := '';           aJobs := GetSpoolerJobs('\\ibmserver\HP LaserJet 1100');//正在打印的打印机名字,这里我的打印机时网打。这里你要自己改          for i:=0 to Length(aJobs)-1 do begin 
                  StringGrid1.Cells[i,0] := aJobs[i].pPrinterName; 
                  StringGrid1.Cells[i,1] := aJobs[i].pMachineName; 
                  StringGrid1.Cells[i,2] := aJobs[i].pUserName; 
                  StringGrid1.Cells[i,3] := aJobs[i].pDocument; 
                  StringGrid1.Cells[i,4] := aJobs[i].pDatatype; 
                  StringGrid1.Cells[i,5] := aJobs[i].pStatus; 
                  StringGrid1.Cells[i,6] := IntToStr(aJobs[i].Status);               case aJobs[i].Status of 
                       JOB_STATUS_PAUSED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAUSED'; 
                       JOB_STATUS_ERROR: StringGrid1.Cells[i,6] := 'JOB_STATUS_ERROR'; 
                       JOB_STATUS_DELETING: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETING'; 
                       JOB_STATUS_SPOOLING: StringGrid1.Cells[i,6] := 'JOB_STATUS_SPOOLING'; 
                       JOB_STATUS_PRINTING: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTING'; 
                       JOB_STATUS_OFFLINE: StringGrid1.Cells[i,6] := 'JOB_STATUS_OFFLINE'; 
                       JOB_STATUS_PAPEROUT: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAPEROUT'; 
                       JOB_STATUS_PRINTED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTED'; 
                       JOB_STATUS_DELETED: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETED'; 
                       JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i,6] := 'JOB_STATUS_BLOCKED_DEVQ'; 
                       JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i,6] := 'JOB_STATUS_USER_INTERVENTION'; 
                       JOB_STATUS_RESTART: StringGrid1.Cells[i,6] := 'JOB_STATUS_RESTART'; 
                       JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i,6] := 'JOB_POSITION_UNSPECIFIED';               else StringGrid1.Cells[i,6] := 'Unknown status...'; 
                  end; 
              end;           StringGrid1.Refresh; 
    end; 5- 运行程序,打印程序测之
    OK ⌒_⌒
      

  3.   

    大虾,你真厉害,我已经用你提供的方法解决我的问题了!
    希望你能留下Email,小弟还有些问题想请教!