// 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); }
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)); } }
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)); } }
/// <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); }
// 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); }
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)); } }
// 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)); } }
/// <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)); } }