Visual Basic.NET - ¿Cómo saber cuando está conectada una impresora?

 
Vista:

¿Cómo saber cuando está conectada una impresora?

Publicado por Shania (1 intervención) el 23/06/2004 09:58:39
Hola a todos!
He empezado hace poco a meterme con VB.NET y me gustaría saber si existe alguna forma de saber cuándo está conectada una impresora. Es que tengo un procedimiento que imprime un ticket pero claro, si la impresora está apagada, el procedimiento se bloquea y lo que yo quiero es sacar un mensaje indicando que la impresora no está conectada.
¿alguien tiene alguna idea?
Gracias por adelantado,
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Cómo saber cuando está conectada una impresora

Publicado por Edgar (1501 intervenciones) el 23/06/2004 14:42:55
Hola

Primero debes incluir el espacio de nombres System.Management

Luego puedes usar el siguiente código:

Dim scope as new ManagementScope(@"\root\cimv2")
scope.Connect()

Dim searcher as new ManagementObjectSearcher("SELECT * FROM Win32_Printer")

El ManagmenrObjectSearcher tiene una colección de objetos de tipo ManagmentObject, el cual, en tu caso, será cada una de las impresoras conectadas a tu equipo, incluyendo las impresoras en la red.

Lo que debes hacer es preguntar si están en estatus OffLine, de esta manera:

Dim printer as ManagmentObject
printer = searcher.Get()(0)

Y luego sabes si está fuera de línea asi

if (printer["WorkOffline"].ToString().ToLower().Equals("true"))
... Aqui envias el mensaje
endif

de todas maneras, este código lo puedes ver aqui, el problema es que está en C#

http://www.codeproject.com/csharp/printeroffline.asp

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo saber cuando está conectada una impresora

Publicado por Shania (3 intervenciones) el 23/06/2004 18:01:03
Hola Edgar!
Antes de nada, quiero agradecerte tu ayuda.
He probado el código que me has enviado observando el link con el mismo código en C# y me han surgido varias cuestiones y problemas:

1.- No me reconoce la @ que viene antes del "\root\cimv2" y, ¿podrías decirme que significa? ¿unidad actual?

2.- Tengo problemas en la línea: printer = searcher.Get()(0) VB.NET me la subraya como errónea y no sé por qué. ¿Se te courre alguna ídea?

Muchas gracias.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Cómo saber cuando está conectada una impresora

Publicado por Edgar (1501 intervenciones) el 23/06/2004 18:33:59
Hola

El arroba es sintaxis de C#.. si se me pasó en el mensaje disculpame... se usa para que que el string sea literal (verbose), es decir, en un string común el uso de la barra "\" indica un caracter especial, es decir que se ejecutará una acción especial de acuerdo al caracter que sigue. Por ejemplo \n significa retorno, y \t significa una tabulación. Pues bien, el @ se usa para que la barra no la interprete como caracter especial sino como el caracter como tal.

En la segunda pregunta, el problema fué un error mio.. este método te devuelve una colección de objetos, y lo que se quiere es acceder al primero de ellos... Claro que esto es un ejemplo.. lo que debes hacer es iterar sobre todos los objetos de dicha colección ya que todas son impresoras.. esto lo haces asi

For Each share In searcher.Get()
Aqui va el resto del código
Next share

Espero te sirva

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me funciona

Publicado por Shania (2 intervenciones) el 23/06/2004 18:34:47
Hola Edgar!
Sigo preguntándome por el significado de la @ en el código, pero te comento:
He puesto el siguiente código:

Dim scope As New ManagementScope("\root\cimv2")
scope.Connect()
Dim searcher As New ManagementObjectSearcher("Select * from Win32_Printer")

Dim printer As ManagementObject

For Each printer In searcher.Get()
If (printer("WorkOffline").ToString().ToLower().Equals("TRUE")) Then
MessageBox.Show("La impresora no está conectada")
Else
ImprimirTicket()
End If

Next

¿Me he olvidado de algo? El caso es que me sigue pasando lo mismo: cuando la impresora está conectada todo perfecto pero cuando está apagada se bloquea el proyecto.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona

Publicado por Edgar (1501 intervenciones) el 23/06/2004 18:44:17
Hola

Como te mencione anteriormente el @ es para el uso de c# y su uso hace que la cadena que tiene a continuación se interprete de manera distinta, sobre todo por el uso de la barra. No te preocupes por eso...

Bueno, hay que averiguar un poco más sobre que puede estar sucediendo.. posiblemente el problema es que no hay que colocar el WorkOffline sino otra cadena... dejame averiguar un poco más a ver que puedo conseguir.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona

Publicado por Shania (1 intervención) el 23/06/2004 18:54:56
Muchas gracias Edgar!

Lo de la @ me ha quedado claro, lo que pasa es que debimos enviar la nota a la vez y cuando llegó la mia con el código, también llegó la tuya con la respuesta :-)

Te comento un poco más, mirando el código con el debugger, justo se bloquea en la línea:

If (printer("WorkOffline").ToString().ToLower().Equals("TRUE")) Then

así que o es como dices tú que no hay que colocar el WorkOffline o también te digo que me dice que el objeto Printer está vacío.

Muchísimas gracias por tu ayuda.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona

Publicado por Edgar (1501 intervenciones) el 23/06/2004 19:07:29
Hola

Bueno.. fijate en una cosa... estas colocando TRUE, pero fijate que el string lo esta pasando a minusculas (el método ToLower hace eso) por lo que debes colocar true...

Por otra parte... si el código que me muestras lo colocas dentro del ForEach que te mencioné anteriormente, este código no se ejecutará si el objeto printer está vacio. Asi que en este caso, el problema puede ser otro.

Ahora, no se si el WorkOffline es lo que necesitas como te mencione anteriormente.. revisando la referencia, conseguí que la impresora tiene la propiedad Status, posiblemente te sirva, pero la verdad no se que valores toma por lo que tendrías que probar que te retorna cuando la impresora está apagada...

Si quieres revisar la referencia de los campos que puedes usar puedes ver la siguiente página http://www.webtropy.com/articles/wmi.asp?wmi=Win32_Printer

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lo voy a probar

Publicado por Shania (2 intervenciones) el 23/06/2004 19:30:26
Hola Edgar!

Muchas gracias por tu ayuda, voy a probar lo que me has dicho y te comento. Aunque hasta mañana nada, ya que termino por hoy... ;-)

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Lo voy a probar

Publicado por Shania (3 intervenciones) el 24/06/2004 11:39:48
Hola Edgar!
He mirado las propiedades de mi impresora de tickets y en ella me viene una funcion BiGetStatus que me da el estado de mi impresora, 0 si todo va bien y un número menos que 0 si algún error. El caso es que al llamar a esta función desde el código me dice que no pertenece al objeto printer.
Así que he seguido mirando y también he obtenido el estado que tiene la impresora, es decir, si la impresora está apagada su estado ASB_OFF_LINE es igual a Off-line. Pero sigue sin funcionar.
Te muestro el código.
Ah! el objeto Printer sí tiene valor.

Public Sub ImpresoraConectada()

Dim scope As New ManagementScope("\root\cimv2")
scope.Connect()

Dim searcher As New ManagementObjectSearcher("Select * from Win32_Printer")

Dim printer As ManagementObject

For Each printer In searcher.Get()

If (printer.GetPropertyValue("Status") = "Off-line") Then

MessageBox.Show("La impresora no está conectada" & printer.ToString.ToLower)

Else
MessageBox.Show("La impresora está conectada" & printer.ToString.ToLower)
ImprimirTicket()

End If

Next printer
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Lo voy a probar

Publicado por Edgar (1501 intervenciones) el 25/06/2004 14:28:25
Hola

Recuerda que debes colocar la palabra Off-line exactamente igual a como te lo devuelve al hacer el llamado, a menos que uses el metodo ToLower para que lo pase todo a minuscula o ToUpper para que lo pase todo a mayúscula, asi se hace más sencillo.

Debes colocar el mensaje tal cual como te lo indica cuando masndas a imprimir el status, es decir, si el status es ASB_OFF_LINE, esto es con lo que debes comparar, no con Off-line

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 153
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

RE:¿Cómo saber cuando está conectada una impresora

Publicado por Yamil Bracho (631 intervenciones) el 23/06/2004 18:36:02
1. El simbolo @ es un operador de C# que te permite simplificar la escritura de expresiones de caracter que llevan el simbolo \. En C# el caracter \ es especial e indica secuencia de escape asi que a veces es confuso escribir todos esos \ en los path de los archivos. Si estas pasandolo a VB.NET puedes quitarlo sin problemas

2) Creo que debe ser printer = searcher.Get(0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar