EDITAR: ¡Mi error! Esperé que los cambios se volvieran a escribir en la configuración predeterminada de la impresora cuando, de hecho, solo se modificó la instancia local de PrinterSettings. - El siguiente código parece funcionar como se pretendía¿Cómo se muestran las propiedades de la impresora/diálogo de preferencias y se guardan los cambios?
Estoy tratando de mostrar las propiedades de impresora personalizadas de una impresora determinada. Necesito esto como parte de un PrintDialog personalizado que estoy tratando de escribir.
La mayoría de los ejemplos que puedo encontrar en línea logran mostrar el cuadro de diálogo, pero se pierden todos los cambios que pueda hacer el usuario, lo que lo hace inútil.
Ejemplo: http://www.codeproject.com/KB/system/PrinterPropertiesWindow.aspx
(con respecto a la página anterior: He intentado cambiar el código como lo sugiere BartJoy (en la página), pero que no se ha solucionado el problema)
También probé la muestra y sugerencias de la página pinvoke.net pero todavía no funciona:
http://www.pinvoke.net/default.aspx/winspool.documentproperties
de los sitios web anteriores que suponer que el problema sólo puede estar en un Windows de 64 bits nd/o si el nombre de una impresora tiene más de 32 caracteres.
No sé qué debo intentar a continuación ... ¡Agradezco cualquier sugerencia y comentario!
EDIT: Esto es lo que he intentado:
[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);
[DllImport("winspool.drv")]
private static extern int OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
[DllImport("winspool.drv")]
private static extern int ClosePrinter(IntPtr phPrinter);
[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);
private const int DM_PROMPT = 4;
private const int DM_OUT_BUFFER = 2;
private const int DM_IN_BUFFER = 8;
private void OpenPrinterPropertiesDialog()
{
var printerSettings = new System.Drawing.Printing.PrinterSettings();
var printerName = printerSettings.PrinterName;
IntPtr handle;
OpenPrinter(printerName, out handle, IntPtr.Zero);
IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(hDevMode);
int sizeNeeded = DocumentProperties(this.Handle, handle, printerName, pDevMode, pDevMode, 0);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(this.Handle, handle, printerName, devModeData, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER);
ClosePrinter(handle);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
He intentado utilizar el método OpenPrinter y ClosePrinter y pasar el devModeData como el parámetro de salida en la segunda convocatoria ya que me pareció extraño que el original el código de pinvoke.net no hizo esto. (pero admito que no sé lo que estoy haciendo, esto es solo prueba y error).
Aquí es el código original del sitio PInvoke:
private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
{
IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(hDevMode);
int sizeNeeded = DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, 0);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 14);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
Y ¿cómo ha logrado obtener los chages guardan la espalda? Este código cambia las configuraciones de impresora, pero los cambios no se guardan como la configuración predeterminada de las impresoras :( – Ando