Leitura de Status da Impressora através de API do Windows

MP2032.DLL

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:

 

OffLine/Desconectada/Desligada

0x00000000 (USB/Paralela/Serial)

On-line

0x00000001 (USB/Paralela/Serial)

Fim de papel

0x00000002 (USB/Paralela/Serial)

Pouco papel

0x00000004 (USB/Paralela/Serial)

Cabeça levantada

0x00000008 (USB/Paralela/Serial)

Buffer da impressora cheio

0x00000010 (USB)

Erro na guilhotina

0x00000020 (USB)

Temperatura alta da cabeça

0x00000040 (USB)

Papel Enroscado

0x00000080 (USB)

Papel no presenter*/Sensor da Gaveta**

0x00000100 (USB/Paralela/Serial)

 

*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;