Saber si la impresora esta encendida

718 views
Skip to first unread message

extremo

unread,
Nov 22, 2017, 11:30:19 AM11/22/17
to Comunidad de Visual Foxpro en Español
Hay alguna forma de saber si la impresora esta encendida?

Los codigos SYS(2040) y sys(13) no funcionan, aun cuando la impresora esta desconectada del PC me arroja READY.

Bendiciones

Carlos Alfaro

unread,
Nov 23, 2017, 10:26:25 AM11/23/17
to publice...@googlegroups.com

Saludos cordiales estimado Extremo:

 

Yo también hice esa prueba, lo que me funciono, es lo siguiente:

 

En la configuración de la impresora normalmente esta que todo documento pase por el spooler, cambio el parámetro a que imprima directamente en la impresora, entonces cuando selecciono la impresora en VFP, me devuelve error si no esta encendida.

 

Entonces desde tu manejador de errores podes decidir que hacer.

Bendiciones.

 

 

 

Carlos Alfaro

extremo

unread,
Nov 24, 2017, 7:07:59 AM11/24/17
to Comunidad de Visual Foxpro en Español
Carlos

Gracias por responder. Hice tu sugerencia pero no me cambia los estados, otra cosa que sucede es que el programa se queda esperando la impresión del reporte. Me faltará algún seteo?

Bendiciones

ZeRoberto

unread,
Nov 24, 2017, 7:12:32 AM11/24/17
to publicesvfoxpro
Creo que eso va a ser un poco difícil ya que en estos tiempos los SO tiene una cola de impresión, así la impresora esta apagada estos se almacena hasta que se encienda la impresora. Pero te pregunto para que necesitas saber si la impresora esta encendida?

Saludos

Patricio Muñoz

unread,
Nov 24, 2017, 7:54:27 AM11/24/17
to publice...@googlegroups.com
ZeRoberto

Necesito saber que la impresora este encendida porque el programa que estoy haciendo es un residente en memoria que revisa unos documentos digitales (hecho en fox) que son emitidas en toda la empresa.... cuando el programa ve que hay un documento nuevo, entonces debe imprimirlo automáticamente, luego de eso le cambia el estado del documento a impreso.... Dentro del residente tengo una funcion para ver los documentos que aun no han sido impreso por falla de la impresora. Estos documentos se imprimen en un departamento especial que toman esos documentos y hacen ciertas acciones con ellos. Como puedes ver necesito saber el estado de la impresora. Configurar la impresora con cola de impresión hace que el programa no se pegue pero al desenchufar la impresora del PC, el programa igual lo manda a imprimir y lo marca como exitoso y como consecuencia ese documento se pierde.

Bendiciones

El 24 de noviembre de 2017, 8:12, ZeRoberto <zero...@gmail.com> escribió:
Creo que eso va a ser un poco difícil ya que en estos tiempos los SO tiene una cola de impresión, así la impresora esta apagada estos se almacena hasta que se encienda la impresora. Pero te pregunto para que necesitas saber si la impresora esta encendida?

Saludos

El 24 de noviembre de 2017, 07:07, extremo<protech.ventas@gmail.com> escribió:
Carlos

Gracias por responder. Hice tu sugerencia pero no me cambia los estados, otra cosa que sucede es que el programa se queda esperando la impresión del reporte. Me faltará algún seteo?

Bendiciones


El miércoles, 22 de noviembre de 2017, 12:30:19 (UTC-4), extremo escribió:
Hay alguna forma de saber si la impresora esta encendida?

Los codigos SYS(2040) y sys(13) no funcionan, aun cuando la impresora esta desconectada del PC me arroja READY.

Bendiciones




--
Saludos

Patricio Muñoz
Pro&Tech
Analista en Sistemas

Gregori Arjona Toledo

unread,
Nov 24, 2017, 8:10:47 AM11/24/17
to Comunidad de Visual Foxpro en Español

Utiliza este codigo para ver el estado de cada impresora instalada:


&& Enumera impresoras y estado
strComputer = "."
objWMIService = Getobject("winmgmts:"+ "{impersonationLevel=impersonate}!\\" + strComputer + "\root\cimv2")
colInstalledPrinters = objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
For Each objPrinter In colInstalledPrinters
?"Name: " + objPrinter.Name
Do Case
Case objPrinter.PrinterStatus = 1
strPrinterStatus = "Other"
Case objPrinter.PrinterStatus = 2
strPrinterStatus = "Unknown"
Case objPrinter.PrinterStatus = 3
strPrinterStatus = "Idle"
Case objPrinter.PrinterStatus = 4
strPrinterStatus = "Printing"
Case objPrinter.PrinterStatus = 5
strPrinterStatus = "Warmup"
Endcase
? "Printer Status: " + strPrinterStatus
Next

&& Enumera los trajos de impresion de cada impresora

lcComputer = "."
loWMIService = Getobject("winmgmts:{impersonationLevel=impersonate}!\\" + lcComputer + "\root\cimv2")
colPrintQueues =  loWMIService.ExecQuery ("Select * from Win32_PerfFormattedData_Spooler_PrintQueue Where Name <> '_Total'")
For Each loPrintQueue In colPrintQueues
      ?"Name: " + loPrintQueue.Name
      ?"Current jobs: " + transform(loPrintQueue.Jobs)
Next

Carlos Alfaro

unread,
Nov 24, 2017, 10:27:44 AM11/24/17
to publice...@googlegroups.com

Gracias estimado Gregori, pero como me daba error, investigue y a la variable strComputer le falta un punto debe quedar asi:

 

strComputer = “.”

 

Me va ayudar mucho.

 

Aprovecho de comentar que en donde dos clientes que ocurre que el spooler de Windows devuelve que la impresora no esta lista, pero como no funciona el sys(13), el programa se loquea y pierde la asignación de variables, voy a probar este código, veo muchas posibilidades que sea lo solución.

 

Lo que me llama la atención, en la única prueba que he hecho con éxito, es que tarda unos segundos en dar la respuesta, voy a seguir investigando con este recurso.

 

Que tengan feliz dia.

 

 

Carlos Alfaro

 

From: publice...@googlegroups.com [mailto:publice...@googlegroups.com] On Behalf Of Gregori Arjona Toledo


Sent: viernes, 24 de noviembre de 2017 07:11 a.m.
To: Comunidad de Visual Foxpro en Español

Subject: [vfp] Re: Saber si la impresora esta encendida

 

Utiliza este codigo para ver el estado de cada impresora instalada:

 

 

&& Enumera impresoras y estado

strComputer = ""

objWMIService = Getobject("winmgmts:"+ "{impersonationLevel=impersonate}!\\" + strComputer + "\root\cimv2")

Carlos Alfaro

unread,
Nov 24, 2017, 12:20:13 PM11/24/17
to publice...@googlegroups.com

No logro que funcione para ver los trabajos de impresión de cada impresora, me muestra el siguiente error:

Código de error OLE 0x80041017: Código de estado de COM desconocido.

 

Seguir buscando cual es la causa.

 

Buen día.

 

 

Carlos Alfaro

Antonio Meza

unread,
Nov 24, 2017, 12:29:01 PM11/24/17
to Comunidad de Visual Foxpro en Español
A veces queremos resolver todo con Código, y muchas situaciones se resuelven con una directiva, norma o política de trabajo, es decir que los Empleados verifiquen que siempre este encendida la Impresora y listo tema resuelto!!! 

Al rato también van a querer que si la impresora se le atasco el papel o que se le termino el papel, o que si se descompuso, o que si se le acabo el tonner o tinta, o que si no prende? es decir que todo lo sepas desde el programa??? si se entiende el punto? 

Ya solo falta que los sistema adivinen que documento quiere imprimir el usuario para que no piensen tanto  jajajajaja

saludos
Antonio Meza

GeoSys Diseño de Software

unread,
Nov 24, 2017, 12:35:36 PM11/24/17
to Comunidad de Visual Foxpro en Español
Tienes razón Antonio Meza, el usuario es el indicado para resolver esas situaciones..
Saludos...

Jean Pierre Adonis De La Cruz Garcia

unread,
Nov 24, 2017, 12:45:16 PM11/24/17
to Comunidad de Visual Foxpro en Español
PARA SABER MAS RAPIDO SI ESTA ENCENDIDA TU IMPRESORA ES ESTAR ATENTO Y SIEMPRE DARLE UNA MIRADA Y POR SI ACASO UN EXTINTOR CERCA.

Imagen relacionada

ZeRoberto

unread,
Nov 24, 2017, 4:04:30 PM11/24/17
to publicesvfoxpro
A ver prueba este código que trate de convertir de un código en Delphi

* En Delphi
function IsPrinterAvailable(NamePrinter: String): boolean;
var
   dwStatus: DWORD;
   Needed: DWORD;
   hPrinter: THandle;
begin
   Result:= false;
   if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then
      if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then
          Result:= not(dwStatus = PRINTER_STATUS_NOT_AVAILABLE);
   end;

* En VFP
DECLARE Integer OpenPrinter in WinSpool.Drv as apiOpenPrinter String pPrinterName, Integer @phPrinter, String pDefault
DECLARE Integer ClosePrinter in WinSpool.Drv as apiClosePrinter Integer hPrinter
DECLARE Integer GetPrinter IN winspool.drv AS apiGetPrinter Integer hPrinter, Integer LvL, String @pPrinter, Integer cbBuf, Integer @pcbNeeded

Local lnHandle, lcPrinterName

lcPrinterName = GetPrinter()
If apiOpenPrinter(lcPrinterName, @lnHandle, 0) = 0
   MessageBox("Cannot open printer...")
   apiClosePrinter(lnHandle)
   Return
EndIf

lnSizeOfPrinterInfo = 4 && DWORD Size 4bytes
lcInfoPrinter = Replicate(Chr(0), lnSizeOfPrinterInfo)
If apiGetPrinter(lnHandle, 6, @lcInfoPrinter, lnSizeOfPrinterInfo, @lnSizeOfPrinterInfo) = 0
   MessageBox("Cannot get information for printer...")
   apiClosePrinter(lnHandle)
   Return
EndIf
 *
 ? lcInfoPrinter
 
 apiClosePrinter(lnHandle)


ZeRoberto

unread,
Nov 25, 2017, 6:17:48 AM11/25/17
to publicesvfoxpro
El código debería ser así, pero aun no me arroja resultados

? EstaDisponible(Set('Printer', 2))

Function EstaDisponible(tcPrinterName)
Local llResult, lnHandle, lnSizeOfPrinterInfo, lcInfoPrinter

   #DEFINE PRINTER_STATUS_NOT_AVAILABLE  0x1000

   Declare Integer OpenPrinter In WinSpool.Drv As apiOpenPrinter String pPrinterName, Integer @phPrinter, String pDefault
   Declare Integer ClosePrinter In WinSpool.Drv As apiClosePrinter Integer hPrinter
   Declare Integer GetPrinter In WinSpool.Drv As apiGetPrinter Integer hPrinter, Integer nLevel, String @pPrinter, Integer cbBuf, Integer @pcbNeeded

   llResult = .F.
   If apiOpenPrinter(tcPrinterName, @lnHandle, 0) > 0

      lnSizeOfPrinterInfo = 4 && DWORD Size 4bytes
      lcInfoPrinter = Replicate(Chr(0), lnSizeOfPrinterInfo)
      If apiGetPrinter(lnHandle, 6, @lcInfoPrinter, lnSizeOfPrinterInfo, @lnSizeOfPrinterInfo) > 0
         llResult = Not(CToBin(lcInfoPrinter, "4rs") == PRINTER_STATUS_NOT_AVAILABLE)
      EndIf
   EndIf
   apiClosePrinter(lnHandle)
   Clear Dlls "apiOpenPrinter, apiGetPrinter, apiClosePrinter"
  
Return (llResult)

Reply all
Reply to author
Forward
0 new messages