用内嵌汇编调用中断INT 17H,读取打印机的状态字节加以分析,即可得到其当前状态.
例:输入参数:如果有3个打印端口LPT1、LPT2、LPT3,那么输入参数LPTPort就是1、2、3。

function TestPrinterStatus(LPTPort : word):byte;
var status : byte;
    CheckLPT : word;
begin
    status := 0;
    if (LPTPort >=1) and (LPTPort <=3) then
    begin
        CheckLPT := LPTPort -1;
        asm
          mov dx,CheckLPT;
          mov al,0;
          mov ah,2;
          int 17H;
          mov &status,ah;
        end;
    end;
    result := status;
end;
返回值有以下几种:
01H:超时
08H:I/O错误
10H:打印机未联机
20H:打印机缺纸
80H:打印机空闲。  

·  如何获取当前打印机的名称、驱动程序、打印端口信息:
以下是来自Borland公司的完整例子。请注意其中两条判断语句,这说明有时候仅仅凭getprinters并不能保证信息的正确,还需要WIN.INI的帮助。
uses printers;
{$IFNDEF WIN32}
const MAX_PATH = 144;
{ENDIF}
procedure TForm1.Button1Click(Sender : TObject);
var 
 pDevice : pChar;
   pDriver : pChar;
 pPort   :  pChar;
 hDMode : THandle;
begin
 if PrintDialog1.Execute then begin
   GetMem(pDevice,cchDeviceName);
   GetMem(pDriver,MAX_PATH);
   GetMem(pPort,MAX_PATH);
   Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);
   if lStrLen(pDriver) = 0 then begin
             GetProfileString('Devices',pDevice,'',pDriver,MAX_PATH);
       pDriver[pos(',',pDriver) - 1] := #0;
   end;
   if lStrLen(pPort) = 0 then begin
       GetProfileString('Devices',pDevice,'',pPort,MAX_PATH);
       lStrCpy(pPort,@pPort[lStrLen(pPort) + 2]);
   end;
   FreeMem(pDevice,cchDeviceName);
   FreeMem(pDriver,MAX_PATH);
   FreeMem(pPort,MAX_PATH);
 end;
end;

·  获取打印机队列的状态信息:
        在有些情况下,需要获取打印机队列的状态信息,可以通过WindowsAPI函数ENumJobs来获取打印机队列的状态信息。
    下面的程序片断对获取打印机队列的状态信息进行了说明。
    (1)创建一个新工程;
    (2)在窗体Form1中添加一个Button组件和一个Memo组件,进行相关属性的设置;
    (3)添加Button1的OnClick事件。
procedure TForm1.Button1Click(Sender :TObject);
var
 LPHandle : THandle;//打印机句柄
 LPStrBuf : Array [0..256] of Char;//打印机名称
 NoJobs : Word;  //希望获取的作业数
 s : LongWord;    //Job_Info的字节数
 Job_Info : Array [0..10] of JOB_INFO_1;  //打印队列信息
 cbNeeded : Cardinal;
 cReturned : Cardinal;  //返回的作业数
 ret : LongBool;
 I : integer;
begin
 LPStrBuf := 'HPLaserJet';//指定打印机名
 //打开打印机
 if OpenPrinter() then
 begin
     MessageBox(Form1.Handle,'打开打印机失败。','信息',MB_OK);
     Exit;
 end;
 s := SizeOf(Job_Info);
 cbNeeded := 0;
 cReturned := 0;
 NoJobs := 10;
 ret := ENumJobs(LPHandle,0,NoJobs,1,@Job_Info,s,cbNeeded,cReturn);
 //显示打印队列信息
 Memo1.Lines.Add('共有打印任务:' + InttoStr(cReturned) + '个。');
 for I := 0 to cReturned -1 do
 Memo1.Lines.Add('第' + IntToStr(I+1) + '个打印任务有' + IntToStr(Job_Info[I].TotalPages) + '页。');
end;
在进行测试的时候,应根据系统中安装的打印机设置LPStrBuf的数值,可以通过Windows系统的“控制面板”打开打印机管理器验证运行结果。

·  获取默认打印机的信息:
在Windows的Win.ini文件中有下面的一些配置信息:
[Windows]
load = 
run =
NullPort = None
device = HPLaserJetIII,HPPCL5MS,LPT1
.............
    其中Windows节的device键中指明了当前系统中默认打印机的信息。可以通过WindowsAPI函数GetProfileString获取该信息。函数GetProfileString的原形如下:
 DWORDGetProfileString(
 LPCTSTRlpAppName,  //指定节名的字符串
 LPCTSTRlpKeyName,  //指定键名的字符串
 LPCTSTRlpDefault,    //没有找到键名时返回的字符串
 LPTSTRlpReturnedString,  //在键名找到时返回的字符串
 DWORDnSize    //lpReturnedString的字节数
 );
        例子如下:
    (1)创建一个新的工程;
    (2)在窗体Form1上添加一个Button组件和一个Edit组件,进行相关属性设置;
    (3)添加Button1的OnClick事件。
procedure TForm1.Button1Click(Sender : TObject);
var 
    AppName : Array [0..256] of Char;  //节名称字符串
  KeyName : Array [0..256] of Char; //键名称字符串
  DefaultString : Array [0..256] of Char; //在键名没找到时默认返回的字串
  ReturnedString : Array [0..256] of Char; //在键名找到时返回的字串
begin
    AppName := 'Windows';//节名称
    KeyName := 'device';  //键名称
  GetProfileString(AppName,KeyName,DefaultString,ReturnedString,Sizeof(ReturnedString));
    Edit1.Text := ReturnedString;//显示结果
end;
以上测试可打开win.ini进行对照。 ·  Windows系统默认的打印机信息存放于Win.INI文件中,只有修改了相应的文件内容,再通知Windows系统进行刷新,才算改变了默认的打印机。
下面是程序片断:
var
 strINI : Array [0..MAX_PATH] of Char;
 arrWindows : Array [0..46] of Char;
begin
 GetWindowsDirectory(strINI,SizeOf(strINI));
 StrCat(strINI,'Win.INI');
 with TINIFile.Create(strINI) do
 try  //更改WIN.INI文件中的默认打印机设置
   WriteString('Windows','device','HPLaserJet 4 Plus,HPPCL5MS,LPT1');
 finally
   Free;
 end;
 StrCopy(arrWindows,'Windows');
 SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(@arrWindows)); //发消息
end;

·  调用系统的“页面设置”对话框:
首先要在Uses子句中加入CommDlg单元,参见下例:
procedure TForm1.Button1Click(Sender : TObject);
var s : tagPSD;
begin
    FillChar(s,Sizeof(s),0);
    s.lStructSize := Sizeof(s);
    if PageSetupDlg(s) then
 Showmessage('OK')
    else
 Showmessage('Error');
end;

·  调用系统的“添加打印机”对话框:
ShellExecute(0,'Open','rundll','shell32.dll,SHHelpShortcuts_RunDLL AddPrinter', '' , SW_SHOWNORMAL);

打印测试页:
WinExec('rundll32 msprint2.dll,RUNDLL_PrintTestPage',1);

·  用代码添加打印机:
    需要调用API函数的AddPrinter,它有三个参数:打印机名、打印质量、打印机说明。
    以下代码把函数封装起来。只需要提供出现在Windows中的打印机名,打印机的接口名(例如:LPT1:),驱动器名和打印程序名(通常是winprint)。代码调用了API函数。
unit unit_AddPrinter;
interface
function AddAPrinter(PrinterName,PortName,DriverName,PrintProcessor : string) : boolean;
implementation
uses SysUtil,WinSpool,Windows;

function AddAPrinter(PrinterName,PortName,DriverName,PrintProcessor : string) : boolean;
var
    pName : PChar;
    Level : DWORD;
    pPrinter : PPrinterInfo2;
begin
    pName := Nil;
    Level := 2;
    New(pPrinter);
    pPrinter^.pServerName := nil;
    pPrinter^.pShareName := nil;
    pPrinter^.pComment := nil;
    pPrinter^.pLocation := nil;
    pPrinter^.pDevMode := nil;
    pPrinter^.pSepFile := nil;
    pPrinter^.pDatatype := nil;
    pPrinter^.pParameter := nil;
    pPrinter^.pSecurityDescriptor := nil;
    pPrinter^.Attributes := 0;
    pPrinter^.Priority := 0;
    pPrinter^.DefaultPriority := 0;
    pPrinter^.StartTime := 0;
    pPrinter^.UntilTime := 0;
    pPrinter^.Status := 0;
    pPrinter^.cJobs := 0;  
    pPrinter^.AveragePPM := 0;
    pPrinter^.pPrinterName := PChar(PrinterName);
    pPrinter^.pPortName := PChar(PortName);
    pPrinter^.pDriverName := PChar(DriverName);
    pPrinter^.pPrintProcessor := PChar(PrintProcessor);
    if AddPrinter(pName,Level,pPrinter) <> 0 then
 Result := true
    else begin
 //Showmessage(IntToStr(GetLastError));
 Result := false;
    end;
end; Api函数(打印相关)列表
                                                                                    Api函数名                     函数说明                           适用范围            
                                                                   W3.x W95 NT
AddPrinterConnection          为当前用户建立与打印机的联系            否 是 是
StartPagePrinter              开始打印机                              否 是 是
StartDoc                      开始打印作业                            是 是 是
StartDocPrinter               开始打印作业                            否 是 是
AddPrintProvidor              加入一个打印机支持器                    否 是 是
AddForm                       加入一个打印机窗体                      否 是 是
AddPort                       加入一个打印机端口                      否 是 是
AddMonitor                    加入一个打印机管理器                    否 是 是
ShellExecute                  打开或打印指定文件                      否 是 是
ClosePrinter                  关闭打开的打印机                        否 是 是
WritePrinter                  向打印机输出数据                        否 是 是
AddPrinter                    在打印机服务器上建立一个打印机          否 是 是
SetAbortProc                  设备打印作业的放弃函数                  否 是 是
SetPrinter                    设置打印机信息                          否 是 是
SetPrinterData                设置打印机配置                          否 是 是
SetJob                        设置打印作业信息                        否 是 是
ResetPrinter                  设置打印数据类型和设备模式值            否 是 是
DeletePrinterConnection       删除与打印机的连接                      否 是 是
DeletePrintProcessor          删除打印机处理器                        否 是 是
DeletePrinterDriver           删除打印机驱动程序                      否 是 是
DeletePrinter                 删除打印机服务器上的打印机              否 是 是
DeleteMonitor                 删除打印机监视器                        否 是 是
DeletePrintProvidor           删除打印机提供者                        否 是 是
DeleteForm                    删除打印机窗体层差                      否 是 是
AbortPrinter                  删除打印机缓冲文件                      否 是 是
DeletePort                    删除打印机端口                          否 是 是
AddJob                        启动一个打印作业                        否 是 是
AdvancedDocumentProperties    进行打印机高级设置                      否 是 是
PrintDlg                      建立打印文本对话框                      否 是 是
EnumPrintProcessors           枚举已安装的打印机处理器                否 是 是
EnumPrinterDrivers            枚举已安装的打印机驱动程序              否 是 是
EnumPorts                     枚举可用打印机端口                      否 是 是
EnumPrintProcessorDatatypes   枚举打印机所支持的数据类型              否 是 是
EnumForms                     枚举所支持的打印机窗体                  否 是 是
AbortDoc                      终止一项打印作业                        是 是 是
PrinterProperties             修改打印机属性                          否 是 是
AddPrintProcessor             将打印处理器复制到打印机服务器中        否 是 是
AddPrinterDriver              将打印机驱动程序复制到打印机服务器中    否 是 是
PrinterMessageBox             显示打印作业出错信息                    否 是 是
ConnectToPrinterDlg           显示浏览对话并连接网络打印机            否 是 是
EndPagePrinter                结束打印页                              否 是 是
EndDoc                        结束打印作业                            是 是 是
EndDocPrinter                 结束打印作业                            否 是 是
StartPage                     准备打印机接收数据                      是 是 是
WaitForPrinterChange          监测打印机或打印机服务器变化            否 是 是
GetPrintProcessorDirectory    获取打印机驱动处理器路径                否 是 是
GetPrinterDriver              获取打印机驱动程序信息                  否 是 是
GetPrinterDriverDirectory     获取打印机驱动程序路径                  否 是 是
GetPrinter                    获取打印机信息                          否 是 是
GetPrinterData                获取打印机配置信息                      否 是 是
GetForm                       获取打印机窗口信息                      否 是 是
EnumJobs                      获取打印作业信息                        否 是 是
GetJob                        获取打印作业信息                        否 是 是
OpenPrinter                   获取指定打印机的句柄                    否 是 是
ReadPrinter                   读打印机数据                            否 是 是
DocumentProperties            配置打印机设置                          否 是 是
ConfigurePort                 配置打印机端口                          否 是 是