Monitorare stampante

martedì 07 agosto 2007 - 13.55

luke82 Profilo | Newbie

Qualche idea su come monitorare le stampanti collegate al pc? per monitorare intendo: sapere quante pagine sono state stampate, l'ora, nome documento, dimensione file....
Ho provato a leggere gli eventi di Windows ma non riesco(e a quanto pare non c'è modo) a leggere il numero totale di pagine stampate. Per esempio se stampo 3 copie di un file di 10 pagine negli eventi viene registrato che sono state stampate 10 pagine e non 30.
Ciao

munissor Profilo | Senior Member

Hai provato tramite WMI? Le classi sono Win32_Printer e Win32_PrintJob

luka82 Profilo | Junior Member

Dim path As New System.Management.ManagementPath("root\cimv2")
Dim options As New System.Management.ConnectionOptions
path.Server = "."
Dim scope As New System.Management.ManagementScope(path, options)
Dim query As New System.Management.ObjectQuery( _
"SELECT Name, Document, JobStatus, Owner, TotalPages, Size, TimeSubmitted FROM Win32_PrintJob")
Dim search As New System.Management.ManagementObjectSearcher(scope, query)
Dim objectCollection As System.Management.ManagementObjectCollection

objectCollection = search.Get()

Dim printerName, document, owner As String
Dim pages, size As System.UInt32
Dim timeSubmitted As DateTime
For Each prntJob As System.Management.ManagementObject In objectCollection
printerName = prntJob("Name").ToString().Split(","c)(0)
document = prntJob("Document").ToString()
owner = prntJob("Owner").ToString()
pages = System.Convert.ToUInt32(prntJob("TotalPages"))
size = System.Convert.ToUInt32(prntJob("Size"))
timeSubmitted = System.Management.ManagementDateTimeConverter.ToDateTime(prntJob("TimeSubmitted").ToString())
Next

Questa funzione mi restituisce correttamente i dati che mi interessano. Come posso richiamarla in automatico quando si avvia la stampa?
Ciao e grazie

luka82 Profilo | Junior Member

Sono riuscito a richiamare in automatico la funzione quando viene avviata la stampa solo che mi da errore:
Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'listview1' da un thread diverso da quello da cui è stata eseguita la creazione.
quando tento di fare queste operazioni:
Dim litem As ListViewItem
litem = ListView1.Items.Add("")
litem.SubItems.Add(printerName)
litem.SubItems.Add(timeSubmitted.ToString("G"))

Qualche suggerimento?

munissor Profilo | Senior Member

Non compilare i dati del list view dal secondo thread che usi (o dal background worker..è lo stesso). Compila una struttura temporanea e poi quando rilevi stampe nuove compili i dati del listview dal thread dell'interfaccia utente...

luka82 Profilo | Junior Member

>Non compilare i dati del list view dal secondo thread che usi
>(o dal background worker..è lo stesso). Compila una struttura
>temporanea e poi quando rilevi stampe nuove compili i dati del
>listview dal thread dell'interfaccia utente...

a dire il vero mi aspettavo una risposta del genere. Il fatto è che l'applicazione si compone di una sola form, nessun Thread esterno. mi metto in ascolto dell'evento WMI nella Form_Load del form principale dell'applicazione richiamando una funzione (Private) nella quale ho:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Ciao

luka82 Profilo | Junior Member

Per adesso ho provato con
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
e funziona.
Se stampo due copie di un documento di 2 pagine viene intercettato l'evento con WMI, solo che la proprietà TotalPages restituisce 2 invece di 4!!! Forse dovrei intercettare quando la stampa è conclusa per ottenere il numero di pagine effettivamente stamapate?
come potrei fare?
Ciao e grazie

munissor Profilo | Senior Member

Fai attenzione alle chiamate cross thread sulle finestre perchè potrebbero darti dei risultati totalmente errati.

A parte questo: sei sicuro che non vengano inseriti 2 jobs, uno per copia? Oppure che ci sia il numero di stampe nell'oggetto job?

luka82 Profilo | Junior Member

>Fai attenzione alle chiamate cross thread sulle finestre perchè
>potrebbero darti dei risultati totalmente errati.
Al Cross-Thread ci penserò quando(semmai ci riuscirò...)riesco a ricavare correttamente il numero di pagine stampate.

>A parte questo: sei sicuro che non vengano inseriti 2 jobs, uno
>per copia? Oppure che ci sia il numero di stampe nell'oggetto
>job?
Con il codice che ho postato, se metto WITHIN 60 non mi restituisce niente.
WITHIN 15: Pagine stampate = N/D
e poi comunque a volte mi restituisce qualche valore, seppur non corretto, e a volte non mi restituisce nulla...non so se dipende dalla stampante(Canon), dal driver della stampante, dalle WMI, da me...
Se hai modo di fare qualche prova(gentilmente), così vediamo se dipende da me o da cos'altro
Ti terrò aggiornato, ciao

almax Profilo | Junior Member

Per caso hai risolto ? avrei la stessa esigenza, dovrei monitorare il numero di copie lanciate (stampante di rete) da ogni client .. Vorrei fare un servizio da istallare sui vari client che scrivono in un db che poi potrà essere visto su intranet ..
Grazie
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5