public static void SetDevModeData(this PrinterSettings settings, byte[] data) { //Contract.Requires(settings != null); //Contract.Requires(data != null); //Contract.Requires(data.Length >= Marshal.SizeOf(typeof(NativeMethods.DEVMODE))); RuntimeHelpers.PrepareConstrainedRegions(); try { // cer since AllocHGlobal does not return SafeHandle } finally { var pDevMode = Marshal.AllocHGlobal(data.Length); try { // we don't have to worry about GlobalLock since AllocHGlobal only uses LMEM_FIXED Marshal.Copy(data, 0, pDevMode, data.Length); var devMode = (NativeMethods.DEVMODE)Marshal.PtrToStructure( pDevMode, typeof(NativeMethods.DEVMODE)); // The printer name must match the original printer, otherwise an AV will be thrown settings.PrinterName = devMode.dmDeviceName; // SetHDevmode creates a copy of the devmode, so we don't have to keep ours around settings.SetHdevmode(pDevMode); } finally { Marshal.FreeHGlobal(pDevMode); } } }
private static void UpdateSettings(NativeMethods.PAGESETUPDLG data, PageSettings pageSettings, PrinterSettings printerSettings) { // SetHDevMode demands AllPrintingAndUnmanagedCode Permission : Since we are calling that function we should Assert the permision, IntSecurity.AllPrintingAndUnmanagedCode.Assert(); try { pageSettings.SetHdevmode(data.hDevMode); if (printerSettings != null) { printerSettings.SetHdevmode(data.hDevMode); printerSettings.SetHdevnames(data.hDevNames); } } finally { CodeAccessPermission.RevertAssert(); } Margins newMargins = new Margins(); newMargins.Left = data.marginLeft; newMargins.Top = data.marginTop; newMargins.Right = data.marginRight; newMargins.Bottom = data.marginBottom; PrinterUnit fromUnit = ((data.Flags & NativeMethods.PSD_INHUNDREDTHSOFMILLIMETERS) != 0) ? PrinterUnit.HundredthsOfAMillimeter : PrinterUnit.ThousandthsOfAnInch; pageSettings.Margins = PrinterUnitConvert.Convert(newMargins, fromUnit, PrinterUnit.Display); }
/// EditPrinterSettings #region EditPrinterSettings /// <summary> /// Shows Edit Printer Settings dialog /// </summary> /// <param name="printerSettings">printer settings</param> /// <param name="handle">dialog owner handle</param> /// <returns>dialog result</returns> public static DialogResult EditPrinterSettings(PrinterSettings printerSettings, IntPtr handle) { DialogResult myReturnValue = DialogResult.Cancel; // get handle to devmode IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); // lock data IntPtr pDevMode = GlobalLock(hDevMode); // get properties int sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, 0); IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded); // show dialog long userChoice = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER); long IDOK = (long)DialogResult.OK; // set and save settings from dialog if (userChoice == IDOK) { myReturnValue = DialogResult.OK; printerSettings.SetHdevmode(devModeData); printerSettings.DefaultPageSettings.SetHdevmode(devModeData); } // unlock data and free memory GlobalUnlock(hDevMode); GlobalFree(hDevMode); Marshal.FreeHGlobal(devModeData); return(myReturnValue); }
/// <summary> /// Применение настроек принтера полученных из файла или из массива байт (mode=1 - загрузка из файла/ mode=2 - загрузка из переданного массива) /// </summary> /// <param name="printerSettings"></param> /// <param name="Filename"></param> /// /// <param name="Filename"></param> public void SetDevmode(PrinterSettings printerSettings, int mode, String Filename, byte[] devmodearray) //Grabs the data in arraylist and chucks it back into memory "Crank the suckers out" { ///int mode ///1 = Load devmode structure from file ///2 = Load devmode structure from arraylist IntPtr hDevMode = IntPtr.Zero; // a handle to our current DEVMODE IntPtr pDevMode = IntPtr.Zero; // a pointer to our current DEVMODE Byte[] Temparray; try { var DevModeArray = devmodearray; // Obtain the current DEVMODE position in memory hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); // Obtain a lock on the handle and get an actual pointer so Windows won't move // it around while we're futzing with it pDevMode = GlobalLock(hDevMode); // Overwrite our current DEVMODE in memory with the one we saved. // They should be the same size since we haven't like upgraded the OS // or anything. if (mode == 1) //Load devmode structure from file { FileStream fs = new FileStream(Filename, FileMode.Open, FileAccess.Read); Temparray = new byte[fs.Length]; fs.Read(Temparray, 0, Temparray.Length); fs.Close(); fs.Dispose(); for (int i = 0; i < Temparray.Length; ++i) { Marshal.WriteByte(pDevMode, i, Temparray[i]); } } if (mode == 2) //Load devmode structure from arraylist { for (int i = 0; i < DevModeArray.Length; ++i) { Marshal.WriteByte(pDevMode, i, DevModeArray[i]); } } // We're done futzing GlobalUnlock(hDevMode); // Tell our printer settings to use the one we just overwrote printerSettings.SetHdevmode(hDevMode); printerSettings.DefaultPageSettings.SetHdevmode(hDevMode); // It's copied to our printer settings, so we can free the OS-level one GlobalFree(hDevMode); } catch (Exception ex) { if (hDevMode != IntPtr.Zero) { MessageBox.Show("BUGGER"); GlobalUnlock(hDevMode); // And to boot, we don't need that DEVMODE anymore, either GlobalFree(hDevMode); hDevMode = IntPtr.Zero; } } }
public PrinterSettings GetPS() { if (string.IsNullOrEmpty(dm.dmDeviceName)) { return(null); } var ps = new PrinterSettings(); IntPtr ptr = IntPtr.Zero; Marshal.StructureToPtr(dm, ptr, true); ps.SetHdevmode(ptr); return(ps); }
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, ref pDevMode, 0); IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded); DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14); GlobalUnlock(hDevMode); printerSettings.SetHdevmode(devModeData); printerSettings.DefaultPageSettings.SetHdevmode(devModeData); GlobalFree(hDevMode); Marshal.FreeHGlobal(devModeData); }
public static void SetDevModeData(this PrinterSettings settings, byte[] data) { if (settings == null) { throw new ArgumentNullException(nameof(settings), "Contract assertion not met: settings != null"); } if (data == null) { throw new ArgumentNullException(nameof(data), "Contract assertion not met: data != null"); } if (!(data.Length >= Marshal.SizeOf(typeof(NativeMethods.DEVMODE)))) { throw new ArgumentException("Contract assertion not met: data.Length >= Marshal.SizeOf(typeof(NativeMethods.DEVMODE))", nameof(data)); } RuntimeHelpers.PrepareConstrainedRegions(); try { // cer since AllocHGlobal does not return SafeHandle } finally { var pDevMode = Marshal.AllocHGlobal(data.Length); try { // we don't have to worry about GlobalLock since AllocHGlobal only uses LMEM_FIXED Marshal.Copy(data, 0, pDevMode, data.Length); var devMode = (NativeMethods.DEVMODE)Marshal.PtrToStructure( pDevMode, typeof(NativeMethods.DEVMODE)); // The printer name must match the original printer, otherwise an AV will be thrown if (!settings.PrinterName.StartsWith(devMode.dmDeviceName)) { throw new InvalidOperationException(string.Format("Printer name " + "stored in options does not match the name stored in the " + "print ticket. DEVMODE cannot be used unless the device " + "name matches exactly. \r\nOptions file: '{0}'\r\nPrint " + "ticket: '{1}'", devMode.dmDeviceName, settings.PrinterName)); } // SetHDevmode creates a copy of the devmode, so we don't have to keep ours around settings.SetHdevmode(pDevMode); } finally { Marshal.FreeHGlobal(pDevMode); } } }
private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings) { var handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle; var hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); var pDevMode = GlobalLock(hDevMode); var sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, ref pDevMode, 0); var devModeData = Marshal.AllocHGlobal(sizeNeeded); DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14); GlobalUnlock(hDevMode); printerSettings.SetHdevmode(devModeData); printerSettings.DefaultPageSettings.SetHdevmode(devModeData); GlobalFree(hDevMode); Marshal.FreeHGlobal(devModeData); }
public void SetHdevmode_IntPtr_Success() { var printerSettings = new PrinterSettings() { Copies = 3 }; var newPrinterSettings = new PrinterSettings() { Copies = 6 }; IntPtr handle = printerSettings.GetHdevmode(); newPrinterSettings.SetHdevmode(handle); Assert.Equal(printerSettings.Copies, newPrinterSettings.Copies); Assert.Equal(printerSettings.Collate, newPrinterSettings.Collate); Assert.Equal(printerSettings.Duplex, newPrinterSettings.Duplex); }
public static void ShowPropertiesDialog(PrinterSettings printerSettings) { IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); IntPtr handle; OpenPrinter(printerSettings.PrinterName, out handle, IntPtr.Zero); IntPtr pDevMode = GlobalLock(hDevMode); int result = DocumentProperties(IntPtr.Zero, handle, printerSettings.PrinterName, pDevMode, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER); GlobalUnlock(hDevMode); if (result == 1) { printerSettings.SetHdevmode(hDevMode); printerSettings.DefaultPageSettings.SetHdevmode(hDevMode); } ClosePrinter(handle); }
// Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods // are required for updating the settings from the structure utilized by the dialog. // Take information from print dialog and put in PrinterSettings private static void UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, short copies, int flags, PrinterSettings settings, PageSettings pageSettings) { // Mode settings.SetHdevmode(hDevMode); settings.SetHdevnames(hDevNames); if (pageSettings != null) { pageSettings.SetHdevmode(hDevMode); } //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies... if (settings.Copies == 1) { settings.Copies = copies; } settings.PrintRange = (PrintRange)(flags & printRangeMask); }
public void SetHdevmode_IntPtr_Success() { string printerName = GetNameOfTestPrinterSuitableForDevModeTesting(); var printerSettings = new PrinterSettings() { PrinterName = printerName, Copies = 3 }; var newPrinterSettings = new PrinterSettings() { PrinterName = printerName, Copies = 6 }; IntPtr handle = printerSettings.GetHdevmode(); newPrinterSettings.SetHdevmode(handle); Assert.Equal(printerSettings.Copies, newPrinterSettings.Copies); Assert.Equal(printerSettings.Collate, newPrinterSettings.Collate); Assert.Equal(printerSettings.Duplex, newPrinterSettings.Duplex); }
public static void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, IntPtr handle) { IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); IntPtr pDevMode = GlobalLock(hDevMode); int sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 0); if (sizeNeeded < 0) { GlobalUnlock(hDevMode); return; } IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded); DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER | DM_PROMPT); GlobalUnlock(hDevMode); printerSettings.SetHdevmode(devModeData); printerSettings.DefaultPageSettings.SetHdevmode(devModeData); GlobalFree(hDevMode); Marshal.FreeHGlobal(devModeData); }
} // proc SetPrintDocument /// <summary>Copy printer settings from System.Printing to System.Drawing</summary> /// <param name="printerSettings"></param> /// <param name="printQueue"></param> /// <param name="printTicket"></param> public static void SetPrintTicket(this PrinterSettings printerSettings, PrintQueue printQueue, PrintTicket printTicket) { using (var printTicketConverter = new PrintTicketConverter(printQueue.Name, PrintTicketConverter.MaxPrintSchemaVersion)) { printerSettings.PrinterName = printQueue.Name; var bDevMode = printTicketConverter.ConvertPrintTicketToDevMode(printTicket, BaseDevModeType.UserDefault, PrintTicketScope.JobScope); var pDevMode = Marshal.AllocHGlobal(bDevMode.Length); try { // copy settings Marshal.Copy(bDevMode, 0, pDevMode, bDevMode.Length); printerSettings.SetHdevmode(pDevMode); printerSettings.DefaultPageSettings.SetHdevmode(pDevMode); } finally { Marshal.FreeHGlobal(pDevMode); } } } // proc SetPrintTicket
private DialogResult EditPrinterSettings(PrinterSettings printerSettings) { DialogResult myReturnValue = DialogResult.Cancel; IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); IntPtr pDevMode = GlobalLock(hDevMode); int sizeNeeded = DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 0); IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded); long userChoice = DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER); long IDOK = (long)DialogResult.OK; if (userChoice == IDOK) { myReturnValue = DialogResult.OK; printerSettings.SetHdevmode(devModeData); printerSettings.DefaultPageSettings.SetHdevmode(devModeData); } GlobalUnlock(hDevMode); GlobalFree(hDevMode); Marshal.FreeHGlobal(devModeData); return(myReturnValue); }
private static void UpdateSettings(NativeMethods.PAGESETUPDLG data, PageSettings pageSettings, PrinterSettings printerSettings) { pageSettings.SetHdevmode(data.hDevMode); if (printerSettings != null) { printerSettings.SetHdevmode(data.hDevMode); printerSettings.SetHdevnames(data.hDevNames); } Margins newMargins = new Margins(); newMargins.Left = data.marginLeft; newMargins.Top = data.marginTop; newMargins.Right = data.marginRight; newMargins.Bottom = data.marginBottom; PrinterUnit fromUnit = ((data.Flags & NativeMethods.PSD_INHUNDREDTHSOFMILLIMETERS) != 0) ? PrinterUnit.HundredthsOfAMillimeter : PrinterUnit.ThousandthsOfAnInch; pageSettings.Margins = PrinterUnitConvert.Convert(newMargins, fromUnit, PrinterUnit.Display); }
// Take information from print dialog and put in PrinterSettings private static void UpdatePrinterSettings(NativeMethods.PRINTDLG data, PrinterSettings settings, PageSettings pageSettings) { // Mode settings.SetHdevmode(data.hDevMode); settings.SetHdevnames(data.hDevNames); if (pageSettings != null) { pageSettings.SetHdevmode(data.hDevMode); } // PrintDlg int flags = data.Flags; //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies... //this is Native PrintDialogs BUG... if (settings.Copies == 1) { settings.Copies = data.nCopies; } settings.PrintRange = (PrintRange)(flags & printRangeMask); }
public void GetHdevmode_Zero_ThrowsArgumentException() { var printerSettings = new PrinterSettings(); AssertExtensions.Throws <ArgumentException>(null, () => printerSettings.SetHdevmode(IntPtr.Zero)); }