“另存为”对话框显示在打印到 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 支持从 32 位进程打印到 Splwow64.exe 进程。 Splwow64.exe 是一个 64 位进程,可以加载 64 位打印机驱动程序,并处理 32 位进程的打印。

当应用程序调用 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 打印机来避免此问题。 然后,应用程序在调用 StartDoc 函数时指定结构成员中DOCINFO.lpszOutput文件的完整路径。 打印机驱动程序将使用指定的文件,而不是提示用户输入文件。

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。