Windows11 22H2におけるUI改善によるWindowsAPIのPrintDlgEx()の動作について

Mizuma, Takayoshi/水間 隆好 0 評価のポイント
2025-08-21T02:53:05.51+00:00

WindowsAPIのPrintDlgEx()を使用して印刷ダイアログを表示させているが、Windows11 22H2におけるUI改善により印刷ダイアログのデザイン変更があり、既存の印刷ダイアログが表示されなくなり、新しい「Win32アプリケーションから印刷しています」という印刷ダイアログ画面が表示されるように変更になった。

PrintDlgEx()では以下を指定していますが、指定している情報(プリンタ名、用紙サイズ、印刷方向)が新しい「Win32アプリケーションから印刷しています」という印刷ダイアログ画面では有効にならない。原因を教えて下さい。

PRINTDLGEXA構造体で以下を指定

・hDevNames:プリンタ名

・hDevMode:DEVMODE構造体

        dmPaperSize:用紙サイズ

        dmOrientation:印刷方向
開発者テクノロジ | C++
開発者テクノロジ | C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 13,426 評価のポイント MVP ボランティア モデレーター
    2025-08-21T09:44:07.2866667+00:00

    原因は判りませんが、いつまで使えるかわからないけど以前のダイアログをつかうという小細工なら。

    PRINTDLGEX pdx = { 0 };
    pdx.lStructSize = sizeof(pdx);
    pdx.nPageRanges = 1;
    pdx.nMaxPageRanges = 1;
    pdx.lpPageRanges = (PRINTPAGERANGE*)GlobalAlloc(GPTR, pdx.nMaxPageRanges * sizeof(PRINTPAGERANGE));
    if (!pdx.lpPageRanges)
    {
    	goto CLEANUP;
    }
    pdx.lpPageRanges[0] = { 1,5 };
    pdx.nMinPage = 1;
    pdx.nMaxPage = 5;
    pdx.nCopies = 1;
    pdx.nStartPage = START_PAGE_GENERAL;
    pdx.Flags = PD_RETURNDC | PD_PAGENUMS | PD_DISABLEPRINTTOFILE;
    
    pdx.hDevMode = (DEVMODE*)GlobalAlloc(GPTR, sizeof(DEVMODE));
    if (!pdx.hDevMode)
    {
    	goto CLEANUP;
    }
    else
    {
    	DEVMODE* pdevmode = (DEVMODE*)pdx.hDevMode;
    	wcscpy_s(&pdevmode->dmDeviceName[0], CCHDEVICENAME, L"Microsoft XPS Document Writer");
    	pdevmode->dmSpecVersion = DM_SPECVERSION;
    	pdevmode->dmSize = sizeof(DEVMODE);
    	pdevmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE;
    	pdevmode->dmOrientation = DMORIENT_LANDSCAPE;
    	pdevmode->dmPaperSize = DMPAPER_A3;
    }
    
    pdx.hwndOwner = ::GetDesktopWindow();//デスクトップのHWNDを設定すると以前のダイアログになるという
    
    PrintDlgEx(&pdx);
    
    CLEANUP:
    GlobalFree(pdx.lpPageRanges);
    GlobalFree(pdx.hDevMode);
    

    20250822: DEVMODEのメモリ確保間違え修正

    0 件のコメント コメントはありません

お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "おすすめ" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。