Exemplo n.º 1
0
 // Create a PRINTDLG with a few useful defaults.
 internal static NativeMethods.PRINTDLG CreatePRINTDLG()
 {
     NativeMethods.PRINTDLG data = null;
     if (IntPtr.Size == 4)
     {
         data = new NativeMethods.PRINTDLG_32();
     }
     else
     {
         data = new NativeMethods.PRINTDLG_64();
     }
     data.lStructSize         = Marshal.SizeOf(data);
     data.hwndOwner           = IntPtr.Zero;
     data.hDevMode            = IntPtr.Zero;
     data.hDevNames           = IntPtr.Zero;
     data.Flags               = 0;
     data.hDC                 = IntPtr.Zero;
     data.nFromPage           = 1;
     data.nToPage             = 1;
     data.nMinPage            = 0;
     data.nMaxPage            = 9999;
     data.nCopies             = 1;
     data.hInstance           = IntPtr.Zero;
     data.lCustData           = IntPtr.Zero;
     data.lpfnPrintHook       = null;
     data.lpfnSetupHook       = null;
     data.lpPrintTemplateName = null;
     data.lpSetupTemplateName = null;
     data.hPrintTemplate      = IntPtr.Zero;
     data.hSetupTemplate      = IntPtr.Zero;
     return(data);
 }
Exemplo n.º 2
0
        protected override bool RunDialog(IntPtr hwndOwner)
        {
            var hookProcPtr = new NativeMethods.WndProc(HookProc);

            if (!UseEXDialog)
            {
                NativeMethods.PRINTDLG data = CreatePRINTDLG();
                return(ShowPrintDialog(hwndOwner, hookProcPtr, data));
            }
            else
            {
                NativeMethods.PRINTDLGEX data = CreatePRINTDLGEX();
                return(ShowPrintDialog(hwndOwner, data));
            }
        }
Exemplo n.º 3
0
 public static bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd)
 {
     if (IntPtr.Size == 4)
     {
         if (!(lppd is NativeMethods.PRINTDLG_32 lppd_32))
         {
             throw new NullReferenceException("PRINTDLG data is null");
         }
         return(PrintDlg_32(lppd_32));
     }
     else
     {
         if (!(lppd is NativeMethods.PRINTDLG_64 lppd_64))
         {
             throw new NullReferenceException("PRINTDLG data is null");
         }
         return(PrintDlg_64(lppd_64));
     }
 }
Exemplo n.º 4
0
        /// <include file='doc\PrintDialog.uex' path='docs/doc[@for="PrintDialog.RunDialog"]/*' />
        /// <devdoc>
        /// </devdoc>
        /// <internalonly/>
        // Use PrintDlgEx and PRINTDLGEX on Win2k and newer OS'.
        protected override bool RunDialog(IntPtr hwndOwner)
        {
            bool returnValue = false;

            NativeMethods.WndProc hookProcPtr = new NativeMethods.WndProc(this.HookProc);

            if (!UseEXDialog || (Environment.OSVersion.Platform != System.PlatformID.Win32NT ||
                                 Environment.OSVersion.Version.Major < 5))
            {
                NativeMethods.PRINTDLG data = CreatePRINTDLG();
                returnValue = ShowPrintDialog(hwndOwner, hookProcPtr, data);
            }
            else
            {
                NativeMethods.PRINTDLGEX data = CreatePRINTDLGEX();
                returnValue = ShowPrintDialog(hwndOwner, data);
            }

            return(returnValue);
        }
Exemplo n.º 5
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);
        }
Exemplo n.º 6
0
        private bool ShowPrintDialog(IntPtr hwndOwner, NativeMethods.WndProc hookProcPtr, NativeMethods.PRINTDLG data)
        {
            data.Flags         = GetFlags();
            data.nCopies       = (short)PrinterSettings.Copies;
            data.hwndOwner     = hwndOwner;
            data.lpfnPrintHook = hookProcPtr;

            try
            {
                if (PageSettings == null)
                {
                    data.hDevMode = PrinterSettings.GetHdevmode();
                }
                else
                {
                    data.hDevMode = PrinterSettings.GetHdevmode(PageSettings);
                }

                data.hDevNames = PrinterSettings.GetHdevnames();
            }
            catch (InvalidPrinterException)
            {
                data.hDevMode  = IntPtr.Zero;
                data.hDevNames = IntPtr.Zero;
                // Leave those fields null; Windows will fill them in
            }

            try
            {
                // Windows doesn't like it if page numbers are invalid
                if (AllowSomePages)
                {
                    if (PrinterSettings.FromPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.FromPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "FromPage"));
                    }

                    if (PrinterSettings.ToPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.ToPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "ToPage"));
                    }

                    if (PrinterSettings.ToPage < PrinterSettings.FromPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "FromPage"));
                    }

                    data.nFromPage = (short)PrinterSettings.FromPage;
                    data.nToPage   = (short)PrinterSettings.ToPage;
                    data.nMinPage  = (short)PrinterSettings.MinimumPage;
                    data.nMaxPage  = (short)PrinterSettings.MaximumPage;
                }

                if (!UnsafeNativeMethods.PrintDlg(data))
                {
                    return(false);
                }

                UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings);

                PrintToFile = ((data.Flags & NativeMethods.PD_PRINTTOFILE) != 0);
                PrinterSettings.PrintToFile = PrintToFile;

                if (AllowSomePages)
                {
                    PrinterSettings.FromPage = data.nFromPage;
                    PrinterSettings.ToPage   = data.nToPage;
                }

                // When the flag PD_USEDEVMODECOPIESANDCOLLATE is not set,
                // PRINTDLG.nCopies or PRINTDLG.nCopies indicates the number of copies the user wants
                // to print, and the PD_COLLATE flag in the Flags member indicates
                // whether the user wants to print them collated.
                if ((data.Flags & NativeMethods.PD_USEDEVMODECOPIESANDCOLLATE) == 0)
                {
                    PrinterSettings.Copies  = data.nCopies;
                    PrinterSettings.Collate = ((data.Flags & NativeMethods.PD_COLLATE) == NativeMethods.PD_COLLATE);
                }

                return(true);
            }
            finally
            {
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevMode));
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevNames));
            }
        }
Exemplo n.º 7
0
        // VSWhidbey 93449: Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods
        // are required for showing the print dialog on Win2k and newer OS'.
        private bool ShowPrintDialog(IntPtr hwndOwner, NativeMethods.WndProc hookProcPtr, NativeMethods.PRINTDLG data)
        {
            data.Flags         = GetFlags();
            data.nCopies       = (short)PrinterSettings.Copies;
            data.hwndOwner     = hwndOwner;
            data.lpfnPrintHook = hookProcPtr;

            IntSecurity.AllPrintingAndUnmanagedCode.Assert();

            try {
                if (PageSettings == null)
                {
                    data.hDevMode = PrinterSettings.GetHdevmode();
                }
                else
                {
                    data.hDevMode = PrinterSettings.GetHdevmode(PageSettings);
                }

                data.hDevNames = PrinterSettings.GetHdevnames();
            }
            catch (InvalidPrinterException) {
                data.hDevMode  = IntPtr.Zero;
                data.hDevNames = IntPtr.Zero;
                // Leave those fields null; Windows will fill them in
            }
            finally {
                CodeAccessPermission.RevertAssert();
            }

            try {
                // Windows doesn't like it if page numbers are invalid
                if (AllowSomePages)
                {
                    if (PrinterSettings.FromPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.FromPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "FromPage"));
                    }
                    if (PrinterSettings.ToPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.ToPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "ToPage"));
                    }
                    if (PrinterSettings.ToPage < PrinterSettings.FromPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "FromPage"));
                    }

                    data.nFromPage = (short)PrinterSettings.FromPage;
                    data.nToPage   = (short)PrinterSettings.ToPage;
                    data.nMinPage  = (short)PrinterSettings.MinimumPage;
                    data.nMaxPage  = (short)PrinterSettings.MaximumPage;
                }

                if (!UnsafeNativeMethods.PrintDlg(data))
                {
                    return(false);
                }

                IntSecurity.AllPrintingAndUnmanagedCode.Assert();
                try {
                    UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings);
                }
                finally {
                    CodeAccessPermission.RevertAssert();
                }
                PrintToFile = ((data.Flags & NativeMethods.PD_PRINTTOFILE) != 0);
                PrinterSettings.PrintToFile = PrintToFile;

                if (AllowSomePages)
                {
                    PrinterSettings.FromPage = data.nFromPage;
                    PrinterSettings.ToPage   = data.nToPage;
                }

                // Fix Dev10 #575399, when the flag PD_USEDEVMODECOPIESANDCOLLATE is not set,
                // PRINTDLG.nCopies or PRINTDLG.nCopies indicates the number of copies the user wants
                // to print, and the PD_COLLATE flag in the Flags member indicates
                // whether the user wants to print them collated.
                // Due to a Windows OS Bug 558734, we don't need to consider Windows XP and before
                if ((data.Flags & NativeMethods.PD_USEDEVMODECOPIESANDCOLLATE) == 0)
                {
                    if (Environment.OSVersion.Version.Major >= 6)
                    {
                        PrinterSettings.Copies  = data.nCopies;
                        PrinterSettings.Collate = ((data.Flags & NativeMethods.PD_COLLATE) == NativeMethods.PD_COLLATE);
                    }
                }

                return(true);
            }
            finally {
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevMode));
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevNames));
            }
        }
Exemplo n.º 8
0
        /// <include file='doc\PrintDialog.uex' path='docs/doc[@for="PrintDialog.RunDialog"]/*' />
        /// <devdoc>
        /// </devdoc>
        /// <internalonly/>
        protected override bool RunDialog(IntPtr hwndOwner)
        {
            IntSecurity.SafePrinting.Demand();

            NativeMethods.WndProc hookProcPtr = new NativeMethods.WndProc(this.HookProc);
            if (settings == null)
            {
                throw new ArgumentException(SR.GetString(SR.PDcantShowWithoutPrinter));
            }

            NativeMethods.PRINTDLG data = CreatePRINTDLG();
            data.Flags         = GetFlags();
            data.nCopies       = (short)settings.Copies;
            data.hwndOwner     = hwndOwner;
            data.lpfnPrintHook = hookProcPtr;

            IntSecurity.AllPrinting.Assert();

            try {
                if (PageSettings == null)
                {
                    data.hDevMode = settings.GetHdevmode();
                }
                else
                {
                    data.hDevMode = settings.GetHdevmode(PageSettings);
                }

                data.hDevNames = settings.GetHdevnames();
            }
            catch (InvalidPrinterException) {
                data.hDevMode  = IntPtr.Zero;
                data.hDevNames = IntPtr.Zero;
                // Leave those fields null; Windows will fill them in
            }
            finally {
                CodeAccessPermission.RevertAssert();
            }

            try {
                // Windows doesn't like it if page numbers are invalid
                if (AllowSomePages)
                {
                    if (settings.FromPage < settings.MinimumPage ||
                        settings.FromPage > settings.MaximumPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "FromPage"));
                    }
                    if (settings.ToPage < settings.MinimumPage ||
                        settings.ToPage > settings.MaximumPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "ToPage"));
                    }
                    if (settings.ToPage < settings.FromPage)
                    {
                        throw new ArgumentException(SR.GetString(SR.PDpageOutOfRange, "FromPage"));
                    }

                    data.nFromPage = (short)settings.FromPage;
                    data.nToPage   = (short)settings.ToPage;
                    data.nMinPage  = (short)settings.MinimumPage;
                    data.nMaxPage  = (short)settings.MaximumPage;
                }

                if (!UnsafeNativeMethods.PrintDlg(data))
                {
                    return(false);
                }

                UpdatePrinterSettings(data, settings, PageSettings);
                PrintToFile          = ((data.Flags & NativeMethods.PD_PRINTTOFILE) != 0);
                settings.PrintToFile = PrintToFile;

                if (AllowSomePages)
                {
                    settings.FromPage = data.nFromPage;
                    settings.ToPage   = data.nToPage;
                }

                return(true);
            }
            finally {
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevMode));
                UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevNames));
            }
        }