试试这个吧 //获得缺省打印机的状态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;//获取打印机状态
这里有完整答案: 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;
//获得缺省打印机的状态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;//获取打印机状态
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;