Página 1 de 1
Impressora on-line / off-line
Enviado: 01 Jun 2018 17:07
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,
Impressora on-line / off-line
Enviado: 01 Jun 2018 17:26
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.
Impressora on-line / off-line
Enviado: 01 Jun 2018 18:13
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 ?
Impressora on-line / off-line
Enviado: 04 Jun 2018 11:36
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.
Impressora on-line / off-line
Enviado: 04 Jun 2018 12:05
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) ?
Impressora on-line / off-line
Enviado: 04 Jun 2018 12:32
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 )
Impressora on-line / off-line
Enviado: 04 Jun 2018 13:19
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.
Impressora on-line / off-line
Enviado: 04 Jun 2018 13:40
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
Impressora on-line / off-line
Enviado: 04 Jun 2018 13:54
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
Impressora on-line / off-line
Enviado: 04 Jun 2018 13:58
por asimoes
Quando eu chegar em casa terei como testar nas minhas impressoras.
Impressora on-line / off-line
Enviado: 04 Jun 2018 14:12
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!
Impressora on-line / off-line
Enviado: 04 Jun 2018 15:51
por asimoes
Rochinha perguntas:
usando net start spooler se a impressora estiver offline que é o problema do colega ela mudará o status para online ?
Impressora on-line / off-line
Enviado: 04 Jun 2018 21:24
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