试试这个吧
//
获得缺省打印机的状态
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;
interface
uses
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.html
type
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;
implementation
procedure
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;
interface
uses
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;
//
//获取打印机状态
可用CREATEFILE以PRN为文件名生成一个文件,检测返回值,若成功则打印机可用,否则显示打印机故障。生成关于PRN的文件句柄后,可象普通文件一样向文件写入内容,比如WRITE,写完后关闭文件。
//从并行端口读取打印机状态
function
GetPrinterStatus:byte;
asm
MOV DX,$379;
IN AL,DX;
end;
//获取打印机是否出错
function CheckPrinter:boolean;
var
temp:byte;
begin
temp:=GetPrinterStatus;
Result:=not ( ((temp and $80)=0) //打印机忙
or ((temp and $20)<>0) //打印机缺纸
or ((temp and $10)=0) //打印机未联机
or ((temp and $08)=0) ); //打印机出错;
end;
转载于:https://www.cnblogs.com/hssbsw/archive/2012/02/14/2350336.html