uses WinSpool
function IsPrinterReady(const APrinter: string): Boolean;
var
hGlobal, hPrinter: THandle;
dwNeeded: DWord;
pDefs: TPrinterDefaults;
pInfo: PPrinterInfo2;
bFlag: Boolean;
begin
Result := False;
if APrinter = '' then
Exit;
hGlobal := 0;
try
FillChar(pDefs, SizeOf(TPrinterDefaults), 0);
pDefs.DesiredAccess := {STANDARD_RIGHTS_REQUIRED or} PRINTER_ACCESS_USE;
bFlag := OpenPrinter(PChar(APrinter), hPrinter, @pDefs);
dwNeeded := GetLastError;
if not bFlag or (hPrinter = INVALID_HANDLE_VALUE) then
Exit;
FillChar(pInfo, SizeOf(pInfo), #0);
WinSpool.GetPrinter(hPrinter, 2, nil, 0, @dwNeeded);
if dwNeeded = 0 then
Exit;
hGlobal := GlobalAlloc(GHND, dwNeeded);
if hGlobal = 0 then
Exit;
pInfo := PPrinterInfo2(GlobalLock(hGlobal));
if pInfo = nil then
Exit;
bFlag := WinSpool.GetPrinter(hPrinter, 2, pInfo, dwNeeded, @dwNeeded);
if bFlag then
Result := pInfo.Status = 0
else
Result := False;
finally
if pInfo <> nil then
GlobalUnlock(hGlobal);
if hGlobal <> 0 then
GlobalFree(hGlobal);
if hPrinter <> 0 then
ClosePrinter(hPrinter);
end;
end;