Вы находитесь на странице: 1из 8

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 1 of 8

Id. de artculo: 202480 - ltima revisin: jueves, 27 de diciembre de 2007 - Versin: 1.1

CMO: Determinar el estado de la impresora y del trabajo de


impresin desde Visual Basic

En este artculo se describe cmo utilizar las funciones de la interfaz de


programacin de aplicaciones (API) de Windows en Visual Basic para determinar
mediante programacin el estado de la impresora o de los trabajos de impresin.
Aunque una aplicacin normalmente no tiene que comprobar el estado de una
impresora antes de imprimir, puede ser til determinar mediante programacin el
estado de una impresora o de un trabajo de impresin.

Descripcin de la tcnica
El trmino "impresora" puede hacer referencia a un dispositivo de hardware, una
cola, un controlador o incluso un puerto. En este artculo, el trmino "impresora" se
define como una cola de impresin local. El ejemplo de cdigo de este artculo
devuelve los estados que el sistema operativo notifica. ste es el mismo estado que
el administrador de trabajos de impresin notifica, que puede comprobar
observando la cola de impresin local.
Por ejemplo, para ver la cola en un equipo que ejecuta Microsoft Windows 98, haga
clic en Inicio, seleccione Configuracin, haga clic en Impresoras y, a
continuacin, haga doble clic en el icono de la impresora cuya cola desee ver.
NOTA: no puede comunicarse directamente con la impresora fsica. No debera
tener que hacerlo porque el sistema operativo debe arbitrar el acceso al hardware.
El cdigo de ejemplo de este artculo examina la cola de impresin local, que
obtiene informacin del monitor del puerto, que a su vez se comunica con el
dispositivo fsico. Para obtener una descripcin ms detallada de cmo funciona
esto, consulte los artculos que se enumeran en la seccin "Referencias" de este
artculo.
Este ejemplo notifica el estado de la impresora y de los trabajos, pero observe que
la informacin del estado de los trabajos es generalmente ms confiable para las
aplicaciones. En teora, debera examinar los estados de la impresora y de los
trabajos por separado, y el cdigo debera deducir el estado "meta" de la cola. Sin
embargo, en la mayor parte de las ocasiones, el cdigo puede confiar en los
estados de los trabajos. Adems, este ejemplo recorre los trabajos y comprueba y
notifica el estado de cada uno. Esto se debe a que un trabajo puede seguir a otro
que notifique un problema, por ejemplo, que se ha quedado sin papel o se ha
bloqueado.
NOTA: el sistema slo comprueba el estado cuando tiene un trabajo que poner en
cola. De lo contrario, la cola se considera "preparada" porque puede aceptar
trabajos, aun cuando el hardware est en estado de error. Por ejemplo, si el ltimo
trabajo que se imprimi us la ltima pgina de papel, el sistema operativo no lo
sabe hasta que el sistema intente imprimir de nuevo.
Adems, aunque hay muchos estados que se pueden notificar, muchos no se
admiten en la prctica. El hardware de la impresora y el monitor del puerto

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 2 of 8

determinan qu estados notificar. Por ejemplo, si la impresora se ha quedado sin


papel y est apagada, el estado puede notificarse como "Imprimiendo" porque eso
es lo que el trabajo est intentando hacer. Por consiguiente, una cola que indique
"Preparada" no garantiza que el trabajo de impresin se vaya a completar
correctamente.
Este ejemplo de cdigo examina slo la cola local, lo que debera bastar para la
mayora de las aplicaciones. Sin embargo, conectarse a impresoras remotas puede
llegar a ser bastante complejo. Puede haber colas encadenadas, en las que el
puerto de la cola local est realmente en otra cola. Puede tener colas de impresin,
en las que varias impresoras trabajan desde una sper cola comn. Cuando la
arquitectura se vuelve ms compleja, el cdigo para recuperar un estado
significativo tambin se complica y se reduce la utilidad del estado.
Slo en Microsoft Windows 95, Microsoft Windows 98 y Microsoft Windows
Millennium Edition puede examinar tambin el campo PrinterInfo.Attributes y
consultar el bit PRINTER_ATTRIBUTE_WORK_OFFLINE. Este estado normalmente se
produce debido a la accin del usuario (por ejemplo, si el usuario hace clic con el
botn secundario del mouse en un icono de impresora y, a continuacin, hace clic
en Trabajar sin conexin). Este estado no se debe al cambio de estado de un
trabajo de impresin, aunque el sistema operativo puede forzar el estado si la
impresora no se puede conectar para sacar de la cola un trabajo. En ese caso, el
estado que se notifica suele ser USER_INERVENTION_REQUIRED.

Ejemplo paso a paso:


1.

Cree un nuevo proyecto estndar EXE en Visual Basic. Se crear Form1 de


forma predeterminada.

2.

En el men Proyecto, haga clic en Agregar mdulo y, a continuacin,


agregue el cdigo siguiente:

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 3 of 8

Option Explicit
Public Declare Function lstrcpy Lib "kernel32" _
Alias "lstrcpyA" _
(ByVal lpString1 As String, _
ByVal lpString2 As String) _
As Long
Public Declare Function OpenPrinter Lib "winspool.drv" _
Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
pDefault As PRINTER_DEFAULTS) _
As Long
Public Declare Function GetPrinter Lib "winspool.drv"
Alias "GetPrinterA" _
(ByVal hPrinter As Long, _
ByVal Level As Long, _
pPrinter As Byte, _
ByVal cbBuf As Long, _
pcbNeeded As Long) _
As Long
Public Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) _
As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
_
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
Public Declare Function EnumJobs Lib "winspool.drv"
Alias "EnumJobsA" _
(ByVal hPrinter As Long, _
ByVal FirstJob As Long, _
ByVal NoJobs As Long, _
ByVal Level As Long, _
pJob As Byte, _
ByVal cdBuf As Long, _
pcbNeeded As Long, _
pcReturned As Long) _
As Long
' constants for PRINTER_DEFAULTS structure
Public Const PRINTER_ACCESS_USE = &H8
Public Const PRINTER_ACCESS_ADMINISTER = &H4
' constants for DEVMODE structure
Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 4 of 8

3.
4.

Agregue tres controles CommandButton.


Agregue tres controles TextBox a Form1 y, a continuacin, configure los
controles TextBox como sigue:
a. Establezca la propiedad MultiLine de cada control TextBox en True.
b.

5.

Establezca el tamao de cada control TextBox aproximadamente en


12 cm de ancho y 7 de largo.
c. Establezca la propiedad ScrollBars de cada control TextBox en 2 Vertical.
Agregue un control Timer a Form1.

6.

Agregue el cdigo siguiente al mdulo del formulario:

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 5 of 8

Option Explicit
Private Sub Command1_Click()
'Enable the timer to begin printer status checks.
Timer1.Enabled = True
'Enable and disable start and stop buttons.
Command1.Enabled = False
Command2.Enabled = True
Command3.Enabled = True
End Sub
Private Sub Command2_Click()
'Disable timer to stop further printer checks.
Timer1.Enabled = False
'Enable and disable start and stop buttons.
Command1.Enabled = True
Command2.Enabled = False
Command3.Enabled = True
End Sub
Private Sub Command3_Click()
'Clear the status info.
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
Private Sub Form_Load()
'Initialize captions for control buttons.
Command1.Caption = "Start"
Command2.Caption = "Stop"
Command3.Caption = "Clear"
'Clear the status info.
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Command1.Enabled = True
'Disable stop and clear buttons.
Command2.Enabled = False
Command3.Enabled = False
'Set interval for printer status checking to 1/2 second.
Timer1.Enabled = False
Timer1.Interval = 500
End Sub
Private Sub Timer1_Timer()
Dim PrinterStatus As String
Dim JobStatus As String
Dim ErrorInfo As String

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 6 of 8

7.

8.
9.

10.

Vaya a la cola de impresin y, a continuacin, pause la impresora. Tenga en


cuenta que puede que necesite una impresora local en lugar de una
impresora de red para pausar la cola de impresin.
Ejecute el proyecto de ejemplo y, a continuacin, haga clic en Iniciar.
Realice una o varias operaciones de impresin desde otra aplicacin, por
ejemplo, desde el Bloc de notas. La informacin de la impresora se muestra
en los cuadros de texto. Observe que los detalles del trabajo aparecen en la
ventana Inmediata.
Si es necesario, haga clic en Detener en el formulario para desplazarse a
travs de los cuadros de texto y la ventana Inmediata, y ver la informacin
de esta impresora.

Solucionar problemas


Slo un control de dispositivo concreto puede obtener informacin de estado


de la impresora precisa en tiempo real. Este cdigo obtiene el mismo estado
que el Administrador de trabajos de impresin de Windows notifica.

El estado exacto que se notifica puede variar con las diferentes impresoras y
controladores.

Para obtener informacin adicional sobre cmo se establecen el estado de la


impresora y de los trabajos de impresin, haga clic en el nmero de artculo
siguiente para verlo en Microsoft Knowledge Base:
160129 (http://support.microsoft.com/kb/160129/ ) CMO: Obtener el estado de
una impresora y un trabajo de impresin
Para obtener informacin adicional acerca de cmo utilizar la funcin de la API
EnumPrinters, haga clic en el nmero de artculo siguiente para verlo en Microsoft
Knowledge Base:
166008 (http://support.microsoft.com/kb/166008/ ) ACC: Enumerar las
impresoras locales y de red
Para obtener informacin adicional sobre cmo recuperar informacin del trabajo de
impresin en Microsoft Visual C++, haga clic en los nmeros de artculo siguientes
para verlos en Microsoft Knowledge Base:
228769 (http://support.microsoft.com/kb/228769/ ) CMO: Recuperar
informacin del trabajo de impresin
158828 (http://support.microsoft.com/kb/158828/ ) Cmo llamar adecuadamente
a las API de enumeracin de Win32 Spooler

La informacin de este artculo se refiere a:


Microsoft
Microsoft
 Microsoft
 Microsoft
 Microsoft



Visual
Visual
Visual
Visual
Visual

Basic
Basic
Basic
Basic
Basic

5.0
6.0
5.0
6.0
4.0

Enterprise Edition
Edicin empresarial
Professional Edition
Professional Edition
Standard Edition

Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 7 of 8

Microsoft Visual Basic 4.0 Professional Edition

Palabras clave: kbhowto kbhowtomaster kbapi kbspooler KB202480

http://support.microsoft.com/kb/202480/es

14/04/2010

CMO: Determinar el estado de la impresora y del trabajo de impresin desde Visual Basic Page 8 of 8

Necesita ms ayuda?
Contactar con un profesional de soporte tcnico por correo electrnico, online o por telfono

Soporte Microsoft

http://support.microsoft.com/kb/202480/es

2010 Microsoft

14/04/2010

Вам также может понравиться