Leitura de Status da Impressora através de API do Windows |
GetPrinterData.
Um novo Port Monitor foi desenvolvido para nossas impressoras não fiscais e blocos térmicos, permitindo um maior controle do dispositivo às aplicações que não utilizam a dll, mas sim o subsistema de Spooler do Windows.
Prótotipo da API:
DWORD GetPrinterData( HANDLE hPrinter, // handle para a impressora LPTSTR pValueName, // string que identifica o dado a ser recebido LPDWORD pType, // não utilizado LPBYTE pData, // buffer para receber a informação do status DWORD nSize, // tamanho do buffer LPDWORD pcbNeeded // tamanho necessário em bytes );
Parâmetros desta API:
hPrinter: Handle para a impressora. Use a função OpenPrinter para obter esse handle. pValueName: Deve ser 'PRINTERSTATUS'. pType: Deve ser NULL. pData: Referência para inteiro que recebe a informação. nSize: Tamanho do buffer acima. pcbNeeded: Tamanho necessário.
Observação: Se a função executar com sucesso, o status será retornado na variável pData e pode ser interpretado com um OU lógico dos seguintes valores:
*Para blocos **Para mini impressoras
// Exemplo em Delphi procedure TBematechPrinter.GetStatus(Sender: TObject); var Printer : THandle; need : Cardinal; ret : Bool; data : integer; pData : Pointer; ret1 : integer; PrinterDefaults: TPrinterDefaults; Statusspooler : Tmemo; begin with PrinterDefaults do begin DesiredAccess := PRINTER_ACCESS_ADMINISTER; pDatatype := nil; pDevMode := nil; end; pData := @data; ret := OpenPrinter(pCHAR('Thermal Printer 80mm'),hPrinter,@PrinterDefaults); if ret = true then begin ret1 := GetPrinterData(hPrinter,'PRINTERSTATUS',nil,pData,sizeof(data),need); if ret1 = ERROR_SUCCESS then if ( data = 0 ) then statusspooler.LInes.Add('Off/Off-line/Disconnected') else begin if (data and 1) <> 0 then statusspooler.Lines.Add('On-Line'); if (data and 2) <> 0 then statusspooler.Lines.Add('End of paper'); if ( data and 4) <> 0 then statusspooler.Lines.Add('Low paper'); if ( data and 8 ) <> 0 then statusspooler.Lines.Add('Head up'); if ( data and 16 ) <> 0 then statusspooler.Lines.Add('Buffer is full'); if ( data and 32 ) <> 0 then statusspooler.Lines.Add('Cutter error'); if ( data and 64 ) <> 0 then statusspooler.Lines.Add('Head high temperature'); if ( data and 128 ) <> 0 then statusspooler.LInes.Add('Paper Jam'); if ( data and 256 ) <> 0 then statusspooler.Lines.Add('Paper in the presenter'); end; end; ClosePrinter(hPrinter); end; end; |