Pregunta

Necesitamos poder cambiar la bandeja de impresión seleccionada predeterminada de una impresora determinada. ¿Alguien tiene código VC ++ / win32 para hacer esto?

En caso de que importe, creo que tenemos que cambiar la configuración predeterminada de la impresora. Nuestros trabajos de impresión son ejecutados por una aplicación distinta a la nuestra, por lo que no podemos realizar este tipo de cambios en el contexto de una operación de impresión originada desde dentro de nuestra aplicación. A menos que haya alguna forma de modificar la configuración de impresión predeterminada en una aplicación diferente, creo que estamos atascados cambiando los valores predeterminados del usuario para la impresora, iniciando nuestro trabajo de impresión, y luego estableciendo los valores predeterminados a los valores originales.

Realmente preferiríamos cambiar los valores predeterminados solo para el usuario actual, y no requerir una elevación de UAC especial, etc ...

Sospecho que usará algo similar a lo que se muestra en este artículo de MSDN , e involucra el establecimiento de campos en la estructura DEVMODE (ya sea dmDefaultSource o dmFormName o ambos).

¿Algún tomador? ¿O alguien tiene algún error que quiera compartir?

EDITAR: aquí hay un enlace para la documentación de DEVMODE documentación DEVMODE

EDITAR: También debo señalar que estamos buscando una solución general, no algo específico para una impresora en particular (implementamos en muchos, muchos entornos)

¿Fue útil?

Solución

FYI - la solución que terminamos usando fue capturar la estructura DEVMODE. Tenemos una pequeña aplicación win32 que presenta el cuadro de diálogo de configuración de la impresora (a través de DocumentProperties con fMode configurado en DM_IN_PROMPT). El DEVMODE resultante se guarda en el disco. Cuando hacemos nuestra impresión, capturamos el DEVMODE actual, configuramos el DEVMODE almacenado, iniciamos la impresión, y luego restauramos el DEVMODE original.

Esto realmente funciona bastante bien. Ocasionalmente, los controladores de impresión se actualizarán y causarán que el DEVMODE almacenado se rompa, pero eso no sucede muy a menudo y es bastante fácil de arreglar para los usuarios.

Como beneficio adicional, este enfoque nos permite capturar TODAS las configuraciones de la impresora (no solo la bandeja de salida), por lo que pudimos admitir configuraciones avanzadas como grapado, clasificación, etc. ...

Sugerencia: si intenta esto, asegúrese de escribir en el disco como una secuencia de salida binaria. En mi evaluación inicial de este enfoque, configuré accidentalmente la secuencia de salida como una secuencia de salida de texto. Las cosas funcionarían bien en muchos casos, y luego se rompen repentinamente para algunas impresoras (que usaban bytes de alto orden en sus datos privados DEVMODE). Un error tonto, pero fácil de cometer, y uno que sacó una buena solución de la mesa por un tiempo.

Otros consejos

La configuración de características como esta puede ser complicada, especialmente si el controlador no sigue las pautas de impresión de Microsoft. Dicho esto, hemos tenido cierto éxito con System.Drawing.Printing.PrinterSettings. Puede configurar PaperSource, pero no estoy seguro de que pueda establecer los valores predeterminados.

Si no has visto este ejemplo, es posible que desees verlo más a fondo. Describe un método para almacenar y recargar la configuración de la impresora. Uno de mis muchachos me lo señaló: PrinterSettings - Cambio, almacenamiento y carga de la configuración de la impresora

Otro método, que podría funcionar pero podría no funcionar para usted, es determinar la cantidad de configuraciones que necesita. Instale una impresora con cada una de estas configuraciones (por ejemplo: Bandeja 1, Bandeja 2). Luego simplemente cambie la impresora predeterminada en la impresión. No es lo que buscas pero puede ayudar.

Lo que normalmente hacemos en estas situaciones es hacer que la aplicación de terceros escriba los datos en una carpeta que estamos monitoreando, luego recogemos el archivo y analizamos PostScript o PCL nosotros mismos, cambiamos la bandeja de papel y luego los enviamos a la dispositivo de destino. Mucho más simple entonces puede sonar.

dmDefaultSource controla la bandeja. Desafortunadamente, los valores que desea configurar varían según el controlador, ya que es un número de papelera y no necesariamente el mismo número que la bandeja # impresa en su impresora.

El siguiente enlace proporciona algunos códigos VB6 para recopilar información sobre las asignaciones de bandeja / bandeja de sus impresoras. Puede usar esa información para asignar dmDefaultSource a la bandeja adecuada. Básicamente, necesitas usar DeviceCapabilities para devolver información sobre tus impresoras y luego buscar una cadena (como " Bandeja 1 ") para obtener el número de bandeja asociado.

http://support.microsoft.com/kb/194789

Hace poco tuve que hacer algo muy similar en un controlador de impresora específico y requería un SDK específico del proveedor . La bandeja no parece aparecer en DEVMODE o en ninguna de las otras estructuras de PRINTINFO_ *, por lo que supongo que enviaré un correo electrónico al proveedor de la impresora.

Como último recurso, puedo pensar en dos posibles hacks. Una de ellas es automatizar el controlador a nivel de GUI utilizando una herramienta con script como AutoIT . La segunda es volcar el registro en un archivo, cambiar la configuración del controlador, volcar el registro nuevamente y comparar las diferencias (pueden o no funcionar).

Que yo sepa, las impresoras son controladas por el controlador de la impresora enviándoles comandos SNMP o PJL. Pero no todas las impresoras implementan completamente estos conjuntos de comandos.

Para las impresoras HP que encontré en: http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&cc=us&objectID=bpl07282&jumpid=reg_R1002_USEN algunos comandos PJL (hay algunos relacionados con los comandos de PJL la bandeja también).

No estoy seguro de esta ayuda, pero tómelo como una sugerencia para futuras búsquedas ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top