public unsafe void PRINTDLGW_64_ensure_layout() { PRINTDLGW_64 sut = new PRINTDLGW_64(); byte * addr = (byte *)&sut; Assert.Equal(0, (byte *)&sut._lStructSize - addr); // 8, DWORD Assert.Equal(8, (byte *)&sut._hwndOwner - addr); // 8, HWND Assert.Equal(16, (byte *)&sut._hDevMode - addr); // 8, HGLOBAL Assert.Equal(24, (byte *)&sut._hDevNames - addr); // 8, HGLOBAL Assert.Equal(32, (byte *)&sut._hDC - addr); // 8, HDC Assert.Equal(40, (byte *)&sut._flags - addr); // 8, DWORD Assert.Equal(44, (byte *)&sut._nFromPage - addr); // 2, WORD Assert.Equal(46, (byte *)&sut._nToPage - addr); // 2, WORD Assert.Equal(48, (byte *)&sut._nMinPage - addr); // 2, WORD Assert.Equal(50, (byte *)&sut._nMaxPage - addr); // 2, WORD Assert.Equal(52, (byte *)&sut._nCopies - addr); // 2, WORD // 2 bytes alignment 54 -> 56 Assert.Equal(56, (byte *)&sut._hInstance - addr); // 8, HINSTANCE Assert.Equal(64, (byte *)&sut._lCustData - addr); // 8, LPARAM Assert.Equal(72, (byte *)&sut._lpfnPrintHook - addr); // 8, LPPRINTHOOKPROC Assert.Equal(80, (byte *)&sut._lpfnSetupHook - addr); // 8, LPSETUPHOOKPROC Assert.Equal(88, (byte *)&sut._lpPrintTemplateName - addr); // 8, LPCWSTR Assert.Equal(96, (byte *)&sut._lpSetupTemplateName - addr); // 8, LPCWSTR Assert.Equal(104, (byte *)&sut._hPrintTemplate - addr); // 8, HGLOBAL Assert.Equal(112, (byte *)&sut._hSetupTemplate - addr); // 8, HGLOBAL }
private unsafe bool ShowPrintDialog(IntPtr hwndOwner) { PRINTDLGW data; if (IntPtr.Size == 4) { data = new PRINTDLGW_32 { lStructSize = (uint)sizeof(PRINTDLGW_32) }; } else { data = new PRINTDLGW_64 { lStructSize = (uint)sizeof(PRINTDLGW_64) }; } data.nFromPage = 1; data.nToPage = 1; data.nMinPage = 0; data.nMaxPage = 9999; data.Flags = GetFlags(); data.nCopies = (ushort)PrinterSettings.Copies; data.hwndOwner = hwndOwner; User32.WNDPROCINT wndproc = new User32.WNDPROCINT(HookProc); data.lpfnPrintHook = Marshal.GetFunctionPointerForDelegate(wndproc); try { if (PageSettings is null) { data.hDevMode = PrinterSettings.GetHdevmode(); } else { data.hDevMode = PrinterSettings.GetHdevmode(PageSettings); } data.hDevNames = PrinterSettings.GetHdevnames(); } catch (InvalidPrinterException) { // Leave those fields null; Windows will fill them in data.hDevMode = IntPtr.Zero; data.hDevNames = IntPtr.Zero; } 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 = (ushort)PrinterSettings.FromPage; data.nToPage = (ushort)PrinterSettings.ToPage; data.nMinPage = (ushort)PrinterSettings.MinimumPage; data.nMaxPage = (ushort)PrinterSettings.MaximumPage; } if (PrintDlg(ref data).IsFalse()) { var result = CommDlgExtendedError(); return(false); } UpdatePrinterSettings(data.hDevMode, data.hDevNames, (short)data.nCopies, data.Flags, settings, PageSettings); PrintToFile = (data.Flags & 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 & PD.USEDEVMODECOPIESANDCOLLATE) == 0) { PrinterSettings.Copies = (short)data.nCopies; PrinterSettings.Collate = (data.Flags & PD.COLLATE) == PD.COLLATE; } return(true); } finally { GC.KeepAlive(wndproc); Kernel32.GlobalFree(data.hDevMode); Kernel32.GlobalFree(data.hDevNames); } }
private static extern BOOL PrintDlgW(ref PRINTDLGW_64 lppd);