Modifica programmatica della stampante di destinazione per un controllo WebBrowser di WinForms

Sto cercando di utilizzare un controllo WebBrowser invisibile per stampare un documento HTML molto semplice. La nostra applicazione richiede che siamo in grado di stampare diversi documenti in questo modo, e che tutti possono essere inviati a diverse stampanti. Sfortunatamente, non ho avuto molto successo nel rendere l’output adatto alla stampante giusta.

Il modo in cui funziona adesso è che prima di stampare un documento, l’applicazione determina quale stampante lo deve ricevere e imposta di conseguenza la stampante predefinita. Per fare ciò usa SetDefaultPrinter () importato da WinSpool.drv. Se passo il codice in modalità di debug, posso vedere chiaramente che la stampante predefinita cambia (e questa modifica si riflette nell’interfaccia utente del pannello di controllo), ma WebBrowser continua a utilizzare la stampante predefinita originale.

La documentazione MSDN, da quello che ho visto, non fornisce realmente una soluzione per questo scenario. Apprezzerei molto l’input su come posso farlo a livello di programmazione.

Visto quello che hai detto, forse se riavvii il processo che contiene il controllo del browser web (o il processo che è il controllo del browser web), dopo aver cambiato la stampante predefinita? Questo è il tipo di cosa che vedo accadere qui , per esempio.


Suppongo che sarebbe ansible sborsare un processo in background che fa la stampa vera e propria, ma spero davvero in una soluzione più semplice.

Forking è stato il mio primo pensiero verso una soluzione probabilmente la più semplice.

Alcune altre alternative sono le seguenti.

1). IE, che il controllo del browser sta eseguendo il wrapping, espone le API tramite ActiveX. Una delle sue / quelle API potrebbe consentire di specificare la stampante di destinazione.

2). Alcuni eseguibili (non so di IE) hanno printto voci nel registro. Ad esempio, Acrobat Reader ha una voce il cui valore è il seguente:

 ""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"" /t "%1" "%2" "%3" "%4" 

Viene utilizzato per specificare la syntax della riga di comando che è ansible utilizzare per stampare e specificare una stampante (non predefinita). Puoi anche Google per printto , vedi ad esempio il comando PrintTo in ShellExecute .

3). Ho implementato un controllo HTML per .NET del mio, che non dipende da IE. Dici che il tuo HTML (e il CSS che presumo) sono semplici, quindi forse posso renderlo , fuori dalla scatola o con un minimo sforzo di sviluppo extra. Non supporto la stampa, ma la stampa è abbastanza semplice da implementare per un controllo utente. Farmi implementare quello per te ti costerebbe parecchie centinaia ma, chissà, forse ne vale la pena. Sarebbe una soluzione abbastanza leggera e forse ben supportata. Puoi scrivermi se vuoi discuterne ulteriormente.

4). Potresti anche trovare altri controlli, simili ai miei, più o meno famosi / costosi; o altre applicazioni, ad es. OpenOffice ecc. ecc.

5). Potresti considerare la conversione dell’HTML (in qualche modo) in un altro formato (es. PDF) per il quale hai un’applicazione che ti offre un supporto migliore per la stampa.

Ho avuto lo stesso identico problema e ho incorporato questo controllo al posto di .NET WebBrowser standard per aggirare il problema.

Funziona su .NET 3.5, se non prima

 this.webBrowser1.ShowPrintDialog();