///<summary> /// Obtain a DEVMODE from a printer ///</summary> ///<param name="pHandle">Printer handle</param> ///<param name="baseType">Type of DEVMODE (printer default or user default)</param> ///<param name="devModeBytes">DEVMODE bytes</param> ///<returns>False if the call fails</returns> private DevMode GetDEVMODE(BaseDevModeType baseType) { DevMode result; switch (baseType) { case BaseDevModeType.PrinterDefault: { PRINTER_INFO_2 info = GetPrinterInfo2W(); result = info.pDevMode; break; } case BaseDevModeType.UserDefault: { PRINTER_INFO_8_AND_9 info = GetPrinterInfo8Or9W(true); if (info.pDevMode != null) { result = info.pDevMode; } else { // No user default devmode, try the printer default, which is // effectively the user default if their isn't a per user default // overriding it. result = GetDEVMODE(BaseDevModeType.PrinterDefault); } break; } default: { throw new ArgumentOutOfRangeException("baseType"); } } if (result == null) { throw new PrintSystemException(); } return(result); }
/// <summary> /// A callback that copies PRINTER_INFO_8_AND_9 fields from an unmanaged buffer /// </summary> public void Callback(HGlobalBuffer pPrinterBuffer) { // PRINTER_INFO_8 layout from http://msdn.microsoft.com/en-us/library/dd162851(VS.85).aspx // // typedef struct _PRINTER_INFO_8 { // LPDEVMODE pDevMode; // } PRINTER_INFO_8, *PPRINTER_INFO_8; // // PRINTER_INFO_9 layout from http://msdn.microsoft.com/en-us/library/dd162852(VS.85).aspx // // typedef struct _PRINTER_INFO_9 { // LPDEVMODE pDevMode; // } PRINTER_INFO_9, *PPRINTER_INFO_9; // LPDEVMODE pDevMode; PRINTER_INFO_8_AND_9 = new PRINTER_INFO_8_AND_9(); bool shouldRelease = false; pPrinterBuffer.Handle.DangerousAddRef(ref shouldRelease); try { IntPtr pDevMode = Marshal.ReadIntPtr(pPrinterBuffer.Handle.DangerousGetHandle()); if (pDevMode != IntPtr.Zero) { PRINTER_INFO_8_AND_9.pDevMode = DevMode.FromIntPtr(pDevMode); } } finally { if (shouldRelease) { pPrinterBuffer.Handle.DangerousRelease(); } } }