各位大哥,如何能获得缺省打印机的状态,比如忙,还是出错?
还有如何能准确的知道打印机有没有任务要做?如何设置端口模式?比如原始端口,还是
ECP?

解决方案 »

  1.   

    试试这个吧
    //获得缺省打印机的状态var
      pinfo: pPRINTERINFO2;
      pprt,a: Cardinal;
      b:PDWORD;
    begin
      b:=allocmem(256);
      pinfo:=AllocMem(1000);
      if OpenPrinter('HP DJ 200',pprt,nil) then
      begin
        a:=1000;
        if getprinter(pprt,2,pinfo,a,b) then
          showmessage(pinfo.pPrinterName+' ststus:'+inttostr(pinfo.Status));
      ClosePrinter(pprt);
      end;
      
      freemem(b);
      freemem(pinfo);
    end;PRINTER_INFO_2.Status :
     Windows NT: 
       PRINTER_STATUS_PAUSED
       PRINTER_STATUS_PENDING_DELETION 
     Windows 95: 
       PRINTER_STATUS_BUSY
       PRINTER_STATUS_DOOR_OPEN
       PRINTER_STATUS_ERROR
       PRINTER_STATUS_INITIALIZING
       PRINTER_STATUS_IO_ACTIVE
       PRINTER_STATUS_MANUAL_FEED
       PRINTER_STATUS_NO_TONER
       PRINTER_STATUS_NOT_AVAILABLE
       PRINTER_STATUS_OFFLINE
       PRINTER_STATUS_OUT_OF_MEMORY
       PRINTER_STATUS_OUTPUT_BIN_FULL
       PRINTER_STATUS_PAGE_PUNT
       PRINTER_STATUS_PAPER_JAM
       PRINTER_STATUS_PAPER_OUT
       PRINTER_STATUS_PAPER_PROBLEM
       PRINTER_STATUS_PAUSED
       PRINTER_STATUS_PENDING_DELETION
       PRINTER_STATUS_PRINTING
       PRINTER_STATUS_PROCESSING
       PRINTER_STATUS_TONER_LOW
       PRINTER_STATUS_UNAVAILABLE
       PRINTER_STATUS_USER_INTERVENTION
       PRINTER_STATUS_WAITING
       PRINTER_STATUS_WARMING_UP 
    //////////////////////////////////////////////////////////////////
    unit PrinterStatus;interfaceuses
      Windows, Messages, WinProcs, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
    // TPrinterstatus
    // Komponente zum Abfragen des aktuellen Druckerportstatus
    // Programmiert 2000 von K. Otto
    // funktioniert unter Win 9x, jedoch nicht unter Win NT
    // ---------------------------------
    // Status: Freeware incl. Sourcecode
    // ---------------------------------
    // Diese Komponente beruht auf einem Beitrag von Robert Vivrette
    // f黵 "The unofficial Newsletter of Delphi Users"
    // http://www.undu.com/articles/990228a.htmltype
      TPrinterStatus = class(TComponent)
      private
        { Private-Deklarationen }
        fStatus : Byte;
        fLPT    : Integer;
        Function GetTimeOut : Boolean;
        Function GetIOError : Boolean;
        Function GetPrinterSelected : Boolean;
        Function GetOutOfPaper : Boolean;
        Function GetAcknowledgement : Boolean;
        Function GetPrinterBusy : Boolean;
      protected
        { Protected-Deklarationen }
      public
        { Public-Deklarationen }
        Procedure CheckPrinterStatus; // Liest den Druckerstatus der angegeben LPT-Schnittstelle
        Constructor Create(AOwner : TComponent); Override;
        Property TimeOut : Boolean Read GetTimeOut;
        Property IOError  : Boolean Read GetIOError;
        Property PrinterSelected : Boolean Read GetPrinterSelected;
        Property OutOfPaper : Boolean Read GetOutOfPaper;
        Property Acknowledgement : Boolean Read GetAcknowledgement;
        Property Busy : Boolean Read GetPrinterBusy;
      published
        { Published-Deklarationen }
        Property LPT : Integer Read fLPT Write fLPT;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Eigene', [TPrinterStatus]);
    end;Function TPrinterStatus.GetTimeOut : Boolean;
    Begin
         Result:=(fStatus and $01)=$01;
    End;Function TPrinterStatus.GetIOError : Boolean;
    Begin
         Result:=(fStatus and $08)=$08;
    End;Function TPrinterStatus.GetPrinterSelected : Boolean;
    Begin
         Result:=(fStatus and $10)=$10;
    End;Function TPrinterStatus.GetOutOfPaper : Boolean;
    Begin
         Result:=(fStatus and $20)=$20;
    End;Function TPrinterStatus.GetAcknowledgement : Boolean;
    Begin
         Result:=(fStatus and $40)=$40;
    End;Function TPrinterStatus.GetPrinterBusy : Boolean;
    Begin
         Result:=not ((fStatus and $80)=$80);
    End;Procedure TPrinterStatus.CheckPrinterStatus;
    Var
       Status : Byte;
       CheckLPT : Word;
    Begin
         Status:=0;
         If (fLPT>=1) and (fLPT<=3) Then
         Begin
              CheckLPT:=fLPT-1;
              asm
                mov dx,CheckLPT;
                mov al,0;
                mov ah,2;
                int 17h;
                mov &Status, ah;
              End;
         End;
         fStatus:=Status;
    End;Constructor TPrinterStatus.Create(AOwner : TComponent);
    Begin
         Inherited Create(AOwner);
         fLPT:=1;
         fStatus:=0;
    End;end.
    //////////////////////////////////////////////////////
    用法: if not PrinterStatus1.PrinterReady(0) then  //0 = current printerport
      ShowMessage(PrinterStatus1.StatusMsg) else {print print print} ;unit PrinterStatus;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TPrinterStatus = class(TComponent)
      private
        { Private declarations }
        FPort : Word;
        FStatusStr : string;
      protected
        { Protected declarations }
      public
        { Public declarations }
        function PrinterReady(LPT: Word): boolean;
      published
        { Published declarations }
        property StatusMsg: string read FStatusStr;
      end;procedure Register;implementation
    uses Printers;procedure Register;
    begin
      RegisterComponents('Win95', [TPrinterStatus]);
    end;const
      PrnReady = $90;
      OffLine = $00;
      OffLine2 = $10;             {NEW LINE}
      PaperOut = $20;
      PaperOut2 = $30;            {NEW LINE}
      HookedButOff = $80;         {NEW LINE}
      NoConnect = $B0;            {MODIFIED LINE}  {NOCONNECT = $30 FOR SOME COMPUTERS BY STU}function TPrinterStatus.PrinterReady(LPT: Word): boolean;
    var
      ErrorCode, C : BYTE;
      code, x : integer;
      s : string;           function GetPrinterStatus (LPT: Word): Byte;
               {Pass 1 in LPT for LPT1}
               begin
                 asm
                   mov ah,2
                   mov dx,LPT
                   dec dx
                   int $17
                   mov @Result,ah
                 end;
               end;  {GetPrinterStatus}
    begin
     result := false;  //assume not FPort := LPT;
     if FPort = 0 then begin  {if no port specified then try to set port to current
    printer port}
       {printer name}
       s := Printer.Printers[Printer.PrinterIndex];
       if Pos('FPort',s) <> 0 then begin
         s := Copy(s, Pos('FPort',s) +3, 1);
         Val(s,x,code);
         if code <> 0 then FPort := 1 else FPort := x;
       end else FPort := 1;  {default to LPT1}
     end; {valid LPT is 1..4}
     if (FPort > 4) or (FPort < 1) then begin
       raise ERangeError.CreateFmt(
         'LPT%d is not within the valid range of %d..%d',
         [FPort, 1, 4]);
       exit;
     end;
     ErrorCode := GetPrinterStatus(FPort); ErrorCode := ErrorCode and $B0;       {NEW LINE} C := ERRORCODE shl 6;   {ALWAYS MEANS NOTHING CONNECTED} if C > 0 then ERRORCODE := $B0; {ELEMINATES NO LPT3 AND NOTHING CONNECTED} case ErrorCode of
      PrnReady            : begin FStatusStr := 'Printer Ready'; result := true;
    end;
      NoConnect           : FStatusStr := 'Printer not connected';
      Offline,OffLine2    : FStatusStr := 'Printer off line';     {Modified}
      PaperOut,PaperOut2  : FStatusStr := 'Printer out of paper'; {Modified}
      HookedButOff        : FStatusStr := 'Printer connected but turned off'; {New}
     else
      FStatusStr := 'Printer error code: ' + IntToStr(ErrorCode);
     end;end;//获取打印机状态
      

  2.   

    这里有完整答案:
    http://expert.csdn.net/Expert/topic/1619/1619155.xml?temp=.9477808
    http://expert.csdn.net/Expert/topic/1619/1619181.xml?temp=.5408594
    //以下代码可以查看打印机状态,如果打印机有打印任务,显示前20个打印任务.
    //可以用在网络或者本地打印机上.//得到本机或者网络上共享打印机的状态
    //author:ginsonic
    //zdcnow download from E-E
    use winspool;function PrinterStatusText(Status: Integer): String;
    begin
     case Status of
       0:                            Result := 'Waiting';
       JOB_STATUS_PAUSED:            Result := 'Paused';
       JOB_STATUS_ERROR:             Result := 'Error';
       JOB_STATUS_DELETING:          Result := 'Deleting';
       JOB_STATUS_SPOOLING:          Result := 'Spooling';
       JOB_STATUS_PRINTING:          Result := 'Printing';
       JOB_STATUS_OFFLINE:           Result := 'Offline';
       JOB_STATUS_PAPEROUT:          Result := 'Paper Out';
       JOB_STATUS_PRINTED:           Result := 'Printed';
       JOB_STATUS_DELETED:           Result := 'Deleted';
       JOB_STATUS_BLOCKED_DEVQ:      Result := 'Blocked';
       JOB_STATUS_USER_INTERVENTION: Result := 'User Intervention';
       JOB_STATUS_RESTART:           Result := 'Restart';
     else Result := 'Status ' + IntToStr(Status);
     end;
    end;procedure GetJobs(PrinterName: String; JobList: TStrings);
    const
      InfoLevel = 1;
      FirstJob = 0;
      LastJob = 19;
    var
      Jobs: array [FirstJob..LastJob] of TJobInfo1;
      PrinterHandle, BytesNeeded,NumJobs:Cardinal;
      I: Integer;
    begin
      if OpenPrinter(PChar(PrinterName),PrinterHandle,nil) then
      begin
        if  EnumJobs(PrinterHandle,FirstJob,LastJob+1,InfoLevel,@Jobs,SizeOf(Jobs),BytesNeeded,NumJobs) then begin
          JobList.Clear;
          for I := 0 to NumJobs-1 do
          with Jobs[I] do
            JobList.Add(Format('%s(%s)',[StrPas(pDocument),PrinterStatusText(Status)]));
        end;
        ClosePrinter(PrinterHandle);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //放个memo1来显示状态和打印任务,注意改为你的打印机路径和名称
      GetJobs('Star AR-3200+',Memo1.Lines);
    end;