Cambio programático de la impresora de destino para un control WinForms WebBrowser

Estoy intentando usar un control invisible de WebBrowser para imprimir un documento HTML muy simple. Nuestra aplicación requiere que podamos imprimir varios documentos de esta manera, y que todos puedan enviarse a diferentes impresoras. Desafortunadamente, no he tenido mucho éxito en hacer que la salida vaya a la impresora correcta.

La forma en que funciona en este momento es que antes de imprimir un documento, la aplicación determina qué impresora debe recibirlo y configura la impresora predeterminada en consecuencia. Para hacer esto usa SetDefaultPrinter () importado de WinSpool.drv. Si paso el código en modo de depuración, puedo ver claramente que la impresora predeterminada cambia (y este cambio se refleja en la interfaz de usuario del panel de control), pero WebBrowser sigue insistiendo en usar la impresora predeterminada original.

La documentación de MSDN, por lo que he visto, no proporciona realmente una solución para este escenario. Apreciaría mucho alguna información sobre cómo puedo lograr esto mediante progtwigción.

Dado lo que ha dicho, ¿quizás si reinicia el proceso que contiene el control del navegador web (o el proceso que es el control del navegador web), después de cambiar la impresora predeterminada? Ese es el tipo de cosas que veo que suceden aquí , por ejemplo.


Supongo que sería posible descifrar un proceso en segundo plano que haga la impresión real, pero realmente espero una solución más simple.

Bifurcar fue mi primer pensamiento hacia una solución probablemente más simple.

Algunas otras alternativas son las siguientes.

1). IE, que está envolviendo el control del navegador web, expone las API a través de ActiveX. Una de sus / esas APIs podría permitirle especificar la impresora de destino.

2). Algunos ejecutables (no sé acerca de IE) tienen entradas printto en el registro. Por ejemplo, Acrobat Reader tiene una entrada cuyo valor es el siguiente:

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

Se usa para especificar la syntax de la línea de comandos que puede usar para imprimir y especificar una impresora (no predeterminada). También puede buscar en Google para printto , ver, por ejemplo, el comando PrintTo en ShellExecute .

3). He implementado un control HTML para .NET propio, que no depende de IE. Usted dice que su HTML (y CSS supongo) son simples, así que quizás pueda procesarlo , ya sea de forma inmediata o con solo un pequeño esfuerzo de desarrollo adicional. No admito la impresión, pero la impresión es bastante fácil de implementar para un control de usuario. Conseguir que lo implemente para ti te costaría varios cientos, pero quién sabe, quizás valga la pena para ti. Sería una solución bastante ligera, y quizás bien apoyada. Podría enviarme un correo electrónico si desea discutir eso más a fondo.

4). También puede encontrar otros controles, similares a los míos, más o menos famosos / costosos; u otras aplicaciones, por ejemplo, OpenOffice, etc.

5). Podría considerar convertir el HTML (de alguna manera) a otro formato (por ejemplo, PDF) para el que tenga una aplicación que le brinde un mejor soporte para la impresión.

He tenido exactamente el mismo problema e incorporé este control en lugar del estándar .NET WebBrowser para solucionarlo.

Esto funciona en .NET 3.5, si no antes

 this.webBrowser1.ShowPrintDialog();