Determinare stato stampanti

giovedì 27 ottobre 2005 - 17.34

Fantazma Profilo | Junior Member

Salve a tutti.
Ho necessità di conoscere lo stato delle stampanti collegate al sistema. Per ora ho scritto questo codice:

Dim ListaStampanti As New System.Management.ObjectQuery("SELECT * FROM Win32_printer")
Dim Query As New ManagementObjectSearcher(ListaStampanti)
Dim Risultato As ManagementObjectCollection = Query.Get()
Dim Elemento As ManagementObject
For Each Elemento In Risultato
MsgBox(String.Format("{0} Status {1} ", Elemento("Name"), Elemento("PrinterStatus").ToString))

Tutto bene se non fosse che per tutte le stampanti mi ritorna come valore 3 cioè Sconosciuto... Ho girato in lungo ed in largo le classi WMI, ma non ho trovato nulla e nessuna spiegazione sul perché non funzioni. Ho scaricato dal sito Microsoft il file WMI Tools e visualizzando le proprietà ho visto che tutte le stampanti hanno effettivamente lo stato di sconosciuto... ma andando nella finestra stampanti di Win la sola stampante accesa è evidenziata... perchè insomma Windows sa qual'è l'unica stampante pronta e io no? :-(
Ho provato tutti gli altri attributi quali PrinterStatus, Avaiability etc... ma senza risultato. Alcuni risultano NULL altri perfettamente uguali tra stampanti disponibili e stamanti che non lo sono.
Guardando riga per riga con WMI Tool tutti i parametri estrapolabili tramite WMI query non c'è nulla che differenzi le stampanti on-line da quelle off-line.
Sto cercando di fare qualcosa anche con le API ma non sono andato molto lontano.

Suggerimenti? Consigli? ...o ancor meglio... soluzioni già pronte? :-P

Grazie!!!

Brainkiller Profilo | Guru

Ciao,
allora è strano, perchè anche io avrei subito pensato ad utilizzare WMI, ma effettivamente a volte non si capisce la funzionalità di alcune proprietà che non vengono mai alimentate.

Per conoscere quindi lo stato di una stampante o di Jobs, giustamente hai provato ad utilizzaer le API, qui c'è un esempietto in C/C++. Se hai un po' di esperienza dovresti riuscire a migrarlo su .NET:
http://support.microsoft.com/?id=160129

Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Fantazma Profilo | Junior Member

Ti ringrazio innanzitutto per la risposta...
Allora. Un po' di esperienza ce l'ho... ma non tanta. Questo codice l'avevo trovato ma in pratica non riesco a farlo funzionare. Se ho capito bene lui chiama la funzione
- EnumJobs Lib "winspool.drv"
per definire la grandezza del buffer di lettura dei dati della funzione
- GetPrinter
I problemi che riscontro sono due:
1) La funzione EnumJobs, se una stampante non ha alcun documento nello spooler, non riporta la stampante
2) Chiamando la funzione GetPrinter direttamente non riesco a trovare un modo per dimensionare correttamente il buffer di lettura dei dati.
Sono comunque al punto di partenza quindi. Continuerò a provare...

...ma le WMI se non le valorizzano a cosa servono?

Ciao... e grazie!!!

Brainkiller Profilo | Guru

>1) La funzione EnumJobs, se una stampante non ha alcun documento
>nello spooler, non riporta la stampante
>2) Chiamando la funzione GetPrinter direttamente non riesco a
>trovare un modo per dimensionare correttamente il buffer di
> lettura dei dati.

Purtroppo qui nello specifico non ti posso aiutare prechè non ho esperienza diretta su queste API. So di certo che se usate correttamente funzionano considerato che le usa anche la finestrella della gestione job stampanti di Windows.

>...ma le WMI se non le valorizzano a cosa servono?

E' una cosa che non mi so spiegare, ma non succede solo con queste classi WMI ma anche con altre. Per pigrizia non ho mai cercato risposta a questo quesito però effettivamente una spiegazione ci dev'essere.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5