Impressora on-line / off-line

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
alejesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 09 Jun 2010 20:58
Localização: Osasco - SP
Contato:

Impressora on-line / off-line

Mensagem por alejesus »

Boa tarde pessoal.

Alguém tem ideia de como poderia colocar a impressora on-line e/ou off-line via linha de comando no Windows?

Obrigado,
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Shark
Usuário Nível 1
Usuário Nível 1
Mensagens: 28
Registrado em: 25 Set 2017 21:42
Localização: Brasília - DF

Impressora on-line / off-line

Mensagem por Shark »

Questão intrigante esta visto que o windows gerencia isto perfeitamente. Uma vez a impressora instalada e não havendo resposta da mesma em dado momento o windows a coloca como off-line e vice versa.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

alejesus escreveu:Alguém tem ideia de como poderia colocar a impressora on-line e/ou off-line via linha de comando no Windows?
Qual é a finalidade disso ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
alejesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 09 Jun 2010 20:58
Localização: Osasco - SP
Contato:

Impressora on-line / off-line

Mensagem por alejesus »

Bom dia.

Shark / Asimoes, a situação que estou encontrando é que o Windows coloca a impressora off-line e depois disto só com boot pra voltar a funcionar.

No caso a pessoa que opera o sistema, como na maioria das vezes, é leigo e para evitar suporte estava pensando em fazer o comando de impressora on-line para garantir que a mesma não esteja off-line por qualquer razão, segurando as impressões até que alguém vá lá e coloque a mesma on-line.

Veja a situação que já consegui mapear:

- O operador liga o computador
- Após tudo funcionando, ele percebe que a impressora ficou desligada, então liga
- No Windows a impressora está off-line (Usar impressora off-line)
- Todas as impressões ficam paradas na impressora até que se coloque a mesma on-line manualmente, sendo que algumas vezes só reiniciando pra que a impressão seja reiniciada.

Obrigado pela atenção, vamos ver se consigo alguma orientação com este problema.
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

Creio que até já tenha feito isso, tentou reinstalar o driver da impressora ?
Existe outra impressora do mesmo modelo ?
O driver que instalou é o do fabricante ou é um desses genéricos (oem) ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Impressora on-line / off-line

Mensagem por Kapiaba »

veja se ajuda:

Código: Selecionar todos

   REDEFINE BUTTON oStatusImp ID 302 OF oDlgCCe ;
            ACTION ( STATUS_DA_IMPRESSORA() )

   oStatusImp:cToolTip := OemToAnsi( "Verifique o Status da(s) Sua(s) Impressora(s) Inclusive Virtual" )

Function STATUS_DA_IMPRESSORA()

   aArray := GetPrinters( .T. )

   If Empty( aArray )

      Alert( "Nenhuma impressora Instalada", "Atencao" )

      Return Nil

   Endif

   for i = 1 to len(aArray)

      cPrinterName := substr( aArray[i], 1, at( ",", aArray[i])-1 )

      //? "A impressora " + cPrinterName, IsPrint( alltrim( cPrinterName ) )

      MsgInfo( ( "A Impressora " + cPrinterName )+CRLF+ ;
                                                 +CRLF+ ;
               IsPrint( alltrim( cPrinterName ) ),      ;
               OemToAnsi( "Aten‡Æo Usu rio" ) )


   next

Return nil

Function GetPrinters()

   Local aPrinter := {}
   Local cAllEntries
   Local cEntry
   Local nStart
   Local cName
   Local cPrn
   Local cPort
   Local nJ

   cAllEntries := STRTRAN( GetProfString( "Devices" ), Chr( 0 ), CRLF )

   For nStart := 1 To MlCount( cAllEntries )

       cName  := MemoLine( cAllEntries,,nStart)
       cEntry := GetProfString( "Devices",cName,"")
       nJ     := 2

       Do While ! Empty(cPort := StrToken(cEntry,nJ++,","))
          Aadd(aPrinter,Trim(cName)+" , "+Trim(cPort))
       EndDo

   Next

Return(aPrinter)

function IsPrint( QuePrinter )

   LOCAL nStatus

   DEFAULT QuePrinter := "LPT1:"

   nStatus := PrnStatus( QuePrinter )

   if     nStatus <        1 ; return "Impressora Esta Funcionando OK"
   elseif nStatus =        1 ; return "Impressora Pausada"
   elseif nStatus =        2 ; return "Impressora com Erro"
   elseif nStatus =        4 ; return "Impressora Deletando"
   elseif nStatus =        8 ; return "Impressora em Modo Bandeija"
   elseif nStatus =       16 ; return "Impressora Sem Papel"
   elseif nStatus =       32 ; return "Impressora em Modo Manual"
   elseif nStatus =       64 ; return "Impressora com Problema no Papel"
   elseif nStatus =      128 ; return "Impressora Off Line(Desligada)"
   elseif nStatus =      256 ; return "Impressora com IO Ativo"
   elseif nStatus =      512 ; return "Impressora Ocupada"
   elseif nStatus =     1024 ; return "Impressora Imprimindo"
   elseif nStatus =     2048 ; return "Impressora Memoria Lotada"
   elseif nStatus =     4096 ; return "Impressora Nao Instalada"
   elseif nStatus =     8192 ; return "Impressora Aguardando"
   elseif nStatus =    16384 ; return "Impressora Processando"
   elseif nStatus =    32768 ; return "Impressora Inicializando"
   elseif nStatus =    65536 ; return "Impressora em Atencao"
   elseif nStatus =   131072 ; return "Impressora Toner Baixo"
   elseif nStatus =   262144 ; return "Impressora Sem Toner"
   elseif nStatus =   524288 ; return "Impressora PAGE_PUNT(Ineficinte)"
   elseif nStatus =  1048576 ; return "Impressora Intervencao do Usuario"
   elseif nStatus =  2097152 ; return "Impressora Sem Memoria"
   elseif nStatus =  4194304 ; return "Impressora Tampa Aberta"
   elseif nStatus =  8388608 ; return "Impressora Servidor Desconhecido"
   elseif nStatus = 16777217 ; return "Impressora POWER_SAVE(Poupando Energia)"
   endif

RETURN ( nStatus )
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

Fiz uma leitura melhor do que foi pedido:

How To Modify Printer Settings by Using SetPrinter

No link abaixo tem a informação para Resetar a impressora ou modificar o status dela.

https://support.microsoft.com/en-us/hel ... setprinter

Procurei na MiniGui existe a função EF_RESETPRINTER no fonte winprint.prg teria que isolar o código para somente chamar a função EF_RESETPRINTER que modifica o status da impressora.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Impressora on-line / off-line

Mensagem por rochinha »

Amiguinhos,

Ao invés de manusear uma impressora específica o melhor é manusear o spooler.

Vejamos como esta no meu sistema:

Código: Selecionar todos

  local oMenu
  MENU oMenu POPUP
       MENUITEM "Configura Impressora" ACTION PrinterSetup()
       SEPARATOR
       MENUITEM "Configura Spooler"
	   MENU
           MENUITEM "Desliga Spooler" ACTION fSpooler( 1 )
           MENUITEM "Liga Spooler" ACTION fSpooler( 2 )
           MENUITEM "Limpa Fila de Impressao" ACTION fSpooler( 3 )
	   ENDMENU
       SEPARATOR
Vejamos o que a fução chamada faz:

Código: Selecionar todos

/*
 * Função de manutenção do serviço de spooler de impressoras
 */
FUNCTION fSpooler( opcao, limpaSpool )
   LOCAL oSpooler, nInvisivel := 7

   LOCAL strService := "SPOOLER"
   LOCAL cSpoolPath := getEnvironmentString( "WINDIR" ) + "\SYSTEM32\SPOOL\PRINTERS"

   DEFAULT limpaSpool := "N"
   DEFAULT opcao      := 2

   // Cria objeto oSpooler
   oSpooler := TOleAuto():New( "Wscript.Shell" )
   
   // Se escolha foi Desligar
   do case
      case opcao = 1
	       // Desliga serviço
           //oWnd:SetText( "Desligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net stop " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool desligado..." )
           SysWait( 5 )
	       //
      case opcao = 2
	       // Liga serviço
           //oWnd:SetText( "re-ligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net start " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool re-ligado..." )
           SysWait( 5 )
	       //
      case opcao = 3
	       // Desliga serviço
           //oWnd:SetText( "Desligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net stop " + strService, nInvisivel )
	       // Processa limpeza da fila de impressões
           //oWnd:SetText( "Processando limpeza no spool..." )
           SysWait( 5 )
           nContador := adir( cSpoolPath + "\*.*" )
           if nContador != 0
              DECLARE TXT_NOMES[ nContador ]
              adir( cSpoolPath + "\*.*", TXT_NOMES )
              for nContador = 1 TO LEN( TXT_NOMES )
                  fErase( cSpoolPath + "\" + TXT_NOMES[ nContador ] )
              next
           endif
           // Se quiser esperar algum tempo basta configurar
           SysWait( 5 )
	       // reLiga serviço
           //oWnd:SetText( "re-ligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net start " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool ligado..." )
           SysWait( 5 )
	       //
   endcase

   // Elimina objeto oSpooler
   oSpooler:End()

   RETURN NIL
A função SysWait() é somente um pause cronometrado.

Mais um trecho importante:

Código: Selecionar todos

   // Verificacao de existencia de impressora instalada e/ou configurada
   do case
      case GetPrintDefault()=0 .and. empty( GetPrinter() )
           ? "Nenhuma impressora esta instalada."
      case GetPrintDefault()=0 .and. !empty( GetPrinter() )
           ? "Servico de Spool esta desativado ou nenhuma impressora como padrao."
      case GetPrintDefault()<>0
           // Bloco que perfaz uma busca das impressoras instalados no sistema 
           //aPrinter := GetPrinters()
           //for i = 1 to len(aPrinter)
           //    cPrinter := aPrinter[i]
           //    cPort    := substr(cPrinter,at(",",cPrinter)+1,20)
           //    if MsgYesNO( "Colocar impressora " + cPrinter + " como padrao?" )
           //       //SetPrinter( substr(cPrinter,1,at(",",cPrinter)-1) )
           //       SetPrintDefault( substr(cPrinter,1,at(",",cPrinter)-1) )
           //       // PrinterPortToName( substr(cPrinter,1,at(",",cPrinter)-1) ) // ( "USB002" )
           //       PrinterInit()
           //       //SetDefaultPrinter( substr(cPrinter,1,at(",",cPrinter)-1) )
           //    endif
           //next
   endcase
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

Não tenho como testar essa função porque todas as impressoras daqui estão em rede são gerenciadas pela novell.
A função SetPrinter é que vai mudar o status da impressora de disable para enable, eu não sei isso tem haver com offline/online só fazendo testes.

Código: Selecionar todos


bOk := ResetPrinter()


#pragma BEGINDUMP

#include "hbapiitm.h"

#include <olectl.h>
#include <commctrl.h>

static PRINTER_INFO_2 * pi22      = NULL; // to restore printer dev mode after print.
static HANDLE           hPrinter  = NULL;

HB_FUNC( RESETPRINTER )
{

   BOOL bFlag;

   bFlag = SetPrinter(hPrinter, 0, (byte*)0, PRINTER_CONTROL_SET_STATUS) ;
   
   if ( bFlag )
      hb_retl( 0 );
   else
      hb_retl( 1 );   
  
}

#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

Quando eu chegar em casa terei como testar nas minhas impressoras.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
alejesus
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 09 Jun 2010 20:58
Localização: Osasco - SP
Contato:

Impressora on-line / off-line

Mensagem por alejesus »

Boa tarde pessoal.

Agradeço a todos as informações, vou analisar e testar tudo que foi informado e retorno com mais detalhes.


Um abraço!
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressora on-line / off-line

Mensagem por asimoes »

Rochinha perguntas:

usando net start spooler se a impressora estiver offline que é o problema do colega ela mudará o status para online ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Impressora on-line / off-line

Mensagem por rochinha »

Amiguinhos,
Rochinha perguntas:
usando net start spooler se a impressora estiver offline que é o problema do colega ela mudará o status para online ?
Vejamos impressora ligada não é o mesmo que on-line e vice-versa. Só pra tentar explicar o que acontece.

O Spooler é a ponte entre o S.O. e o hardware. Para a impressora ficar ligada para o usuário mas off-line para o S.O. deveriamos acionar comandos fisicos nela ou comandar operações via gerenciadores.

Quando desligamos o Spooler tornamos a impressora invisivel ao S.O. portanto ele pensa que ela está off-line ou desligada.

Às vezes impressões ficam enroscadas no spool e mesmo deletando tem sempre um que não sai nem com reza-braba. Ai temos de falar para o usuário: "Desliga e liga a impressora".

Aí a mesma está em outra sala, outro andar e fica ruim.

Para excluir os .SPLs gerados no spool diretamente sem desligar o spooler não dá, alguns arquivos ficam preso com quesito de em uso.

Então, desligando o spooler, os arquivos em cache da mesma desaparecem, o spool fica livre para eliminação e a impressora "desligada".

O comando start/stop spooler somente baixa/levanta a ponte mas não diz o estado da impressora.

Testar o spooler evita erros de falta de impressoras instaladas. Ao ligá-lo teremos visão das mesmas e podemos testar seus status.

Por isto coloquei um trecho de testes.

Alguns testes de verificação de impressoras pode nos iludir ao mostrar que as impressoras estão off-line, quando na verdade o spooler é que está parado.

O spooler ativo nos devolve a lista de impressoras quando ligado. Se desligado não devolve nada podendo assim desta forma colocar critica para erro de envio de comando para impressora que não existe ou não está ativa.

Sem o spooler, não temos lista de impressoras, sem impressoras não podemos enviar comandos SET Printer para ativa-las ou desativar ou ver seu estado.

Portanto, tudo depende.

Ou, em resposta a sua pergunta eu podeira simplesmente dizer, NÃO
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder