PDA

View Full Version : [c#] "evento stampa" per ogni applicazione


nikel
09-04-2010, 13:59
ciao gente.

qualcuno ha idea di come intercettare l'attivitā sulla stampante di modo che ogni volta che si stampa qualunque cosa da qualunque programma il mio programma "lo sappia" e possa eseguire del codice? (nella fattispecie dovrebbe riprodurre un suono.)

grazie!!

gugoXX
09-04-2010, 17:05
Tramite WMI puoi prendere il controllo di una printer definita nella tua macchina
Ti verra' restituita l'istanza di una classe nella quale puoi leggere lo stato della stampante.
Andando in polling ogni 2 secondi puoi vedere se la stampante sta stampando oppure se e' in idle, e quindi puoi far suonare il suono non appena passa da
Niente a InStampa (all'inizio della stampa)
oppure quando lo stato passa da
InStampa a Niente (alla fine della stampa)

Non so se si puo' fare senza polling e quindi se si puo' fare con piu' precisione.
(Cosi' rischi di perdere qualcosa immagino, quando ci sono 2 stampe consecutive gia' accodate).

tomminno
09-04-2010, 18:47
ciao gente.

qualcuno ha idea di come intercettare l'attivitā sulla stampante di modo che ogni volta che si stampa qualunque cosa da qualunque programma il mio programma "lo sappia" e possa eseguire del codice? (nella fattispecie dovrebbe riprodurre un suono.)

grazie!!

Che io sappia per fare qualcosa di simile ci sono le API FindFirstPrinterChangeNotification/FindNextPrinterChangeNotification.
Non credo che ci siano in .NET, dovresti usare il P/Invoke.
Questo articolo potrebbe tornarti utile: http://www.codeproject.com/KB/printing/qPrintcomponent2.aspx

nikel
10-04-2010, 09:36
Ho risolto utilizzando questo codice: (in pratica ricevo gli elementi in coda della stampante poi se l'ultimo cambia ed č non null riproduco il suono)


ObjectQuery oq;
ManagementObjectSearcher query1;
ManagementObjectCollection queryCollection1;

oq = new System.Management.ObjectQuery("SELECT * FROM Win32_PrintJob");
query1 = new ManagementObjectSearcher(oq);
queryCollection1 = query1.Get();
foreach( ManagementObject mo in queryCollection1 )
{
lastnow = mo["Document"].ToString(); //stringa dell'elemento in coda
}


grazie!!