[名前を付けて保存] ダイアログ ボックスは、XPS ドキュメント ライターに印刷するアプリケーションの背後に表示されます

この記事は、XPS ドキュメント ライター プリンターに印刷するアプリの背後に [名前を付けて保存 ] ダイアログ ボックスが非表示になり、アプリケーションが応答を停止する問題を解決するのに役立ちます。

元の製品バージョン: XPS ドキュメント ライター
元の KB 番号: 2567869

現象

次のような状況で問題が発生します。

  • 64 ビット バージョンの Windows 7 で 32 ビット アプリケーションを実行します。
  • アプリケーションから Microsoft XPS ドキュメント ライター (MXDW) プリンターに印刷します。 このシナリオでは、[ 名前を付けて保存 ] ダイアログ ボックスがアプリケーションの背後に表示されます。

さらに、次の現象が発生する可能性があります。

  • ファイル名を入力するか、印刷タスクを取り消すまで、アプリケーションは応答を停止 (ハング) しているようです。
  • [ 名前を付けて保存 ] ダイアログ ボックスを閉じると、印刷するアプリケーションがフォアグラウンド (アクティブ) アプリケーションになりません。

注:

この問題は、ドライバーが [ 名前を付けて保存] ダイアログ ボックスまたは別のモーダル ダイアログ ボックスを表示する別のプリンターに印刷するときにも発生する可能性があります。 Adobe PDF プリンターのプリンター ドライバーは、この種類のドライバーです。

原因

プリンター ドライバーは、印刷するプロセスに読み込まれるダイナミック リンク ライブラリ (DLL) として実装されます。 プリンター ドライバーは、64 ビット バージョンの Windows では 64 ビット DLL として、32 ビット バージョンの Windows では 32 ビット DLL として実装されます。

32 ビット プロセスでは、64 ビット DLL を読み込めませんでした。 そのため、64 ビット バージョンの Windows では、Splwow64.exe プロセスを通じて 32 ビット プロセスからの印刷がサポートされます。 Splwow64.exe は、64 ビット プリンター ドライバーを読み込み、32 ビット プロセスの印刷を処理する 64 ビット プロセスです。

アプリケーションが関数を StartDoc 呼び出して XPS ドキュメント ライター プリンターに印刷すると、XPS ドキュメント ライター プリンター ドライバーに [ 名前を付けて保存 ] ダイアログ ボックスが表示され、ユーザーは XPS ファイルの名前と場所を指定できます。 ダイアログ ボックスの所有者ウィンドウは、通常、関数を呼び出している StartDoc スレッドのアクティブ ウィンドウであり、ダイアログ ボックスがアクティブなウィンドウの上に表示されます。

32 ビット アプリケーションが 64 ビット バージョンの Windows で関数を StartDoc 呼び出すと、Splwow64.exe プロセスは 32 ビット アプリケーションの XPS ドキュメント ライター プリンター ドライバーを呼び出します。 このシナリオでは、Splwow64.exe プロセス内のスレッドにアクティブなウィンドウがないため、[ 名前を付けて保存 ] ダイアログ ボックスは未所有です。 Splwow64.exe プロセスにフォアグラウンド ウィンドウを設定する権限がないため、印刷中のアプリケーションの背後にダイアログ ボックスが表示されることがあります。 また、ダイアログは未所有であるため、ダイアログを閉じると、関数を StartDoc 呼び出したアプリケーションがフォアグラウンド アプリケーションにならない可能性があります。

StartDocダイアログ ボックスが閉じられるまで呼び出しは返されないため、アプリケーションが応答を停止するように見える場合があります。

[名前を付けて保存] ダイアログ ボックスには、Splwow64.exe プロセスによって作成された場合、Windows エクスプローラー タスク バーに独自のボタンがあります。 これは、ダイアログ ボックスが未所有であるためです。 タスク バー ボタンは、Splwow64.exe プロセスでフォアグラウンド ウィンドウを設定できない場合にも点滅します。

回避策

この問題を回避するには、タスク バー ボタンから [ 名前を付けて保存 ] ダイアログ ボックスにアクセスします。 または、Alt キーを押しながら Tab キーを押して、フォーカスをダイアログ ボックスに切り替えることができます。

詳細

ソフトウェア開発者は、ユーザーが XPS ドキュメント ライター プリンターまたは Adobe PDF プリンターに印刷するときに、これらのアプリケーションで検出することで、32 ビット アプリケーションでこの問題を回避できます。 次に、アプリケーションは、 関数を呼び出すときに構造体メンバー内の DOCINFO.lpszOutput ファイルへの完全パスを StartDoc 指定します。 プリンター ドライバーは、ユーザーにファイルの入力を求める代わりに、指定したファイルを使用します。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。