Estoy usando WPF y necesito que los usuarios configuren algunas opciones relacionadas con la impresión, como las propiedades de la impresora y la impresora (por ejemplo, papertray, paisaje/retrato, dúplex, etc.). Conozco la clase PrintDialog para obtener un objeto PrintQueue y PrintTicket. Sin embargo, necesito crear una solución personalizada y no puedo mostrar PrintDialog. Logro obtener los objetos PrintQueue disponibles y dejar que los usuarios seleccionen una impresora. Estoy luchando con las propiedades de la impresora. Mi pregunta es: ¿cómo puedo mostrar el cuadro de diálogo en el que un usuario puede establecer las propiedades de la impresora para la PrintQueue seleccionada (el diálogo que se muestra cuando un usuario hace clic en el botón Propiedades en WPF PrintDialog).¿Cómo puedo invocar el diálogo para configurar las opciones de la impresora manualmente?
Respuesta
Se encontró el siguiente código here (menos el evento Window_Loaded
). Lo probé y parece funcionar como un encanto. Obviamente, deberá configurar el nombre de la impresora en el objeto PrinterSettings
antes de mostrar el cuadro de diálogo.
Espero que esto funcione para usted:
[DllImport("kernel32.dll")]
static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")]
static extern bool GlobalUnlock(IntPtr hMem);
[DllImport("kernel32.dll")]
static extern bool GlobalFree(IntPtr hMem);
[DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
private const Int32 DM_OUT_BUFFER = 14;
public void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, System.IntPtr pHandle) {
IntPtr hDevMode = printerSettings.GetHdevmode();
IntPtr pDevMode = GlobalLock(hDevMode);
Int32 fMode = 0;
int sizeNeeded = DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, fMode);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
fMode = DM_OUT_BUFFER;
DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, fMode);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
private void Window_Loaded(object sender, RoutedEventArgs e) {
OpenPrinterPropertiesDialog(new PrinterSettings(), new WindowInteropHelper(this).Handle);
}
Si se dirige a la compilación x 86 y se ejecuta desde una máquina de 64 bits, el código de Pwninstein no va a funcionar: en la asignación de devModeData
, DocumentPropreties
siempre se producirá un error y devuelve un sizeNeeded
de -1, con un código de LastError
13.
para resolver el problema, asegúrese de que usted apunta Cualquier CPU o simplemente cambiar la llamada a DocumentPropreties
a lo siguiente:
int sizeNeeded = DocumentProperties(pHandle,
IntPtr.Zero,
printerSettings.PrinterName,
IntPtr.Zero, // This solves it
pDevMode,
fMode);
Usando IntPtr.Zero
en lugar de un puntero adecuado a una estructura DEVMODE se ve mal, pero esa primera llamada a DocumentProperties no intente modificar la memoria en esa posición. La única información devuelta por la llamada es el tamaño de memoria necesario para almacenar los datos del modo del dispositivo que representan los parámetros internos del controlador de impresión.
Referencia:
- 1. ¿Cómo puedo configurar las opciones de TCP para enviar paquetes?
- 2. ¿Cómo invocar manualmente un evento?
- 3. ¿Puedo configurar las opciones de configuración de Mercurial programáticamente?
- 4. javax.print.attribute.PrintRequestAttributeSet opciones ignoradas por la Impresora
- 5. ¿Cómo insertar opciones manualmente en boost.Program_options?
- 6. cómo configurar el rango en la barra de colores manualmente?
- 7. ¿Cómo configurar las opciones de Internet para el emulador de Android?
- 8. ¿Cómo se muestran las propiedades de la impresora/diálogo de preferencias y se guardan los cambios?
- 9. ¿Cómo puedo saber si una impresora imprimirá en un archivo?
- 10. ¿Cómo configurar la memoria para la máquina virtual en IntelliJ? ¿Debo configurar las opciones de memoria de Tomcat por separado?
- 11. PostgresSQL - cómo configurar manualmente el siguiente valor de auto_increment?
- 12. Configurar manualmente ModelState.isValid desde el controlador
- 13. Cambio de las bandejas de la impresora
- 14. ¿Cómo puedo configurar las opciones en SConstruct para el compilador de C dependiendo del tipo de compilador?
- 15. jQuery UI: configuración de las opciones que se pueden arrastrar para el cuadro de diálogo
- 16. ¿Cómo puedo configurar las opciones de recuperación de un servicio con WiX?
- 17. Activar manualmente el 'diálogo de archivo abierto' usando plupload
- 18. jQuery UI: diálogo mostrar/ocultar efectos con las opciones
- 19. ¿Cómo puedo invocar el desbordamiento del búfer?
- 20. Cómo configurar opciones predeterminadas en datepicker()
- 21. Python win32print cambio de opciones avanzadas de impresora
- 22. ¿Cómo se configuran las opciones de compilación predeterminadas para XE2?
- 23. MVC DropDownListFor - ¿Debo volver a llenar manualmente las opciones después de que la validación falla?
- 24. ¿Cómo configurar manualmente el tipo de entrada de botón en ASP.NET?
- 25. EF CF Configurar la asignación muchos-a-muchos manualmente
- 26. ¿Cómo puedo definir múltiples opciones para UIViewAnimation?
- 27. opciones personalizadas en el diálogo de confirmación de JavaScript
- 28. cómo configurar títulos diferentes para el diálogo de alerta cuando se carga la página WebView?
- 29. ¿Cómo puedo instalar una impresora usando .NET?
- 30. ¿Cómo puedo configurar selenium webdriver para utilizar la configuración personalizada de Firefox para las pruebas?
Ver esta pregunta: http://stackoverflow.com/questions/2437337/how-to-show-printer-properties-preferences-dialog-and -guardar cambios –