diff --git a/src/printsupport/dialogs/qprintdialog_win.cpp b/src/printsupport/dialogs/qprintdialog_win.cpp index 6d8c2d0f4d..259208a71a 100644 --- a/src/printsupport/dialogs/qprintdialog_win.cpp +++ b/src/printsupport/dialogs/qprintdialog_win.cpp @@ -21,6 +21,10 @@ #define START_PAGE_GENERAL 0XFFFFFFFF #endif +namespace { + UINT_PTR __stdcall DummyPrintHookProc (HWND unnamedParam1, UINT unnamedParam2, WPARAM unnamedParam3, LPARAM unnamedParam4) { return 0; } +} + QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; @@ -42,7 +46,7 @@ public: QWin32PrintEnginePrivate *ep; }; -static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWindow *parentWindow, +static void qt_win_setup_PRINTDLG(PRINTDLG *pd, QWindow *parentWindow, QPrintDialog *pdlg, QPrintDialogPrivate *d, HGLOBAL *tempDevNames) { @@ -64,6 +68,12 @@ static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWindow *parentWindow, pd->Flags = PD_RETURNDC; pd->Flags |= PD_USEDEVMODECOPIESANDCOLLATE; + // Workaround to force use of legacy print dialog on Windows 11. + // See: + // https://learn.microsoft.com/en-us/answers/questions/1330355/how-to-programmatically-force-use-of-the-old-print#:~:text=Helg%2C,the%20print%20dialog. + pd->Flags |= PD_ENABLEPRINTHOOK; + pd->lpfnPrintHook = &DummyPrintHookProc; + if (!pdlg->testOption(QPrintDialog::PrintSelection)) pd->Flags |= PD_NOSELECTION; if (pdlg->testOption(QPrintDialog::PrintPageRange)) { @@ -92,13 +102,6 @@ static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWindow *parentWindow, if (!pdlg->testOption(QPrintDialog::PrintCurrentPage)) pd->Flags |= PD_NOCURRENTPAGE; - // Default to showing the General tab first - pd->nStartPage = START_PAGE_GENERAL; - - // We don't support more than one page range in the QPrinter API yet. - pd->nPageRanges = 1; - pd->nMaxPageRanges = 1; - if (d->ep->printToFile) pd->Flags |= PD_PRINTTOFILE; @@ -107,19 +110,19 @@ static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWindow *parentWindow, //So in case there is no valid handle in the application, //use the desktop as valid handle. pd->hwndOwner = wId != 0 ? HWND(wId) : GetDesktopWindow(); - pd->lpPageRanges[0].nFromPage = qMax(pdlg->fromPage(), pdlg->minPage()); - pd->lpPageRanges[0].nToPage = (pdlg->toPage() > 0) ? qMin(pdlg->toPage(), pdlg->maxPage()) : 1; + pd->nFromPage = qMax(pdlg->fromPage(), pdlg->minPage()); + pd->nToPage = (pdlg->toPage() > 0) ? qMin(pdlg->toPage(), pdlg->maxPage()) : 1; pd->nCopies = d->printer->copyCount(); } -static void qt_win_read_back_PRINTDLGEX(PRINTDLGEX *pd, QPrintDialog *pdlg, QPrintDialogPrivate *d) +static void qt_win_read_back_PRINTDLG(PRINTDLG *pd, QPrintDialog *pdlg, QPrintDialogPrivate *d) { if (pd->Flags & PD_SELECTION) { pdlg->setPrintRange(QPrintDialog::Selection); pdlg->printer()->setPageRanges(QPageRanges()); } else if (pd->Flags & PD_PAGENUMS) { pdlg->setPrintRange(QPrintDialog::PageRange); - pdlg->setFromTo(pd->lpPageRanges[0].nFromPage, pd->lpPageRanges[0].nToPage); + pdlg->setFromTo(pd->nFromPage, pd->nToPage); } else if (pd->Flags & PD_CURRENTPAGE) { pdlg->setPrintRange(QPrintDialog::CurrentPage); pdlg->printer()->setPageRanges(QPageRanges()); @@ -208,26 +211,21 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally() bool result; bool doPrinting; - PRINTPAGERANGE pageRange; - PRINTDLGEX pd; - memset(&pd, 0, sizeof(PRINTDLGEX)); - pd.lStructSize = sizeof(PRINTDLGEX); - pd.lpPageRanges = &pageRange; - qt_win_setup_PRINTDLGEX(&pd, parentWindow, q, this, tempDevNames); + PRINTDLG pd; + memset(&pd, 0, sizeof(PRINTDLG)); + pd.lStructSize = sizeof(PRINTDLG); + qt_win_setup_PRINTDLG(&pd, parentWindow, q, this, tempDevNames); do { done = true; - doPrinting = false; - result = (PrintDlgEx(&pd) == S_OK); - if (result && (pd.dwResultAction == PD_RESULT_PRINT - || pd.dwResultAction == PD_RESULT_APPLY)) + result = (PrintDlg(&pd) == TRUE); + if (result) { - doPrinting = (pd.dwResultAction == PD_RESULT_PRINT); if ((pd.Flags & PD_PAGENUMS) - && (pd.lpPageRanges[0].nFromPage > pd.lpPageRanges[0].nToPage)) + && (pd.nFromPage > pd.nToPage)) { - pd.lpPageRanges[0].nFromPage = 1; - pd.lpPageRanges[0].nToPage = 1; + pd.nFromPage = 1; + pd.nToPage = 1; done = false; } if (pd.hDC == 0) @@ -246,10 +244,9 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally() // qt_win_eatMouseMove(); // write values back... - if (result && (pd.dwResultAction == PD_RESULT_PRINT - || pd.dwResultAction == PD_RESULT_APPLY)) + if (result) { - qt_win_read_back_PRINTDLGEX(&pd, q, this); + qt_win_read_back_PRINTDLG(&pd, q, this); // update printer validity printer->d_func()->validPrinter = !printer->printerName().isEmpty(); } @@ -257,9 +254,9 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally() // Cleanup... GlobalFree(tempDevNames); - q->done(result && doPrinting); + q->done(result); - return result && doPrinting; + return result; } void QPrintDialog::setVisible(bool visible)