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);
         }
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        /// <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;
                }
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        // 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);
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
            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);
            }
Beispiel #14
0
        }         // 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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        // 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);
        }
Beispiel #18
0
        public void GetHdevmode_Zero_ThrowsArgumentException()
        {
            var printerSettings = new PrinterSettings();

            AssertExtensions.Throws <ArgumentException>(null, () => printerSettings.SetHdevmode(IntPtr.Zero));
        }