1

我正在尝试创建版本 3 虚拟打印机驱动程序,它使用 XPS 过滤器管道将 XPS 假脱机文件转换为另一个 PDL 并将其保存到磁盘。

我对事物的转换方面很好(使用管道过滤器),但是在向用户展示一个对话框以选择要保存到的路径时,我不确定什么是最好的!

我知道当我将我的虚拟打印机分配给“打印到文件”端口 (FILE:) 时,后台打印程序将在作业进入打印队列之前显示默认保存对话框,如下面的 Windows 7 所示:

默认保存对话框

唯一的问题是默认设置有点太基本了。有没有办法为我的特定打印机驱动程序覆盖这个默认保存对话框并提供我自己的完整保存对话框?

非常感谢!

安迪

为了评论的利益而更新

这是在打印到 Adob​​e PDF 打印机和显示保存对话框的阶段时记事本中主线程的调用堆栈。我想我对这个调用堆栈的解释是在显示保存对话框的阶段没有涉及端口监视器库。我的解释正确吗?如果是这样,问题仍然存在,Adobe PDF 打印机中显示的自定义保存对话框是什么?

ntdll.dll!NtWaitForMultipleObjects+0xa
KERNELBASE.dll!GetCurrentThread+0x36
kernel32.dll!WaitForMultipleObjectsEx+0xb3
USER32.dll!PeekMessageW+0x1cd
DUser.dll+0x14e6
DUser.dll+0x15ef
DUser.dll+0x1565
USER32.dll!TranslateAcceleratorW+0x5e
ntdll.dll!KiUserCallbackDispatcher+0x1f
USER32.dll!WaitMessage+0xa
USER32.dll!MapDialogRect+0x234
USER32.dll!MapDialogRect+0x4c5
USER32.dll!DialogBoxIndirectParamAorW+0x56
USER32.dll!DialogBoxIndirectParamW+0x18
COMDLG32.dll!DllCanUnloadNow+0x590
COMDLG32.dll!Ordinal100+0xb620
COMDLG32.dll!Ordinal100+0xb53f
COMDLG32.dll!Ordinal100+0xb45d
COMDLG32.dll!Ordinal100+0xb31e
COMDLG32.dll!Ordinal100+0xb239
ADUIGP.DLL!DllCanUnloadNow+0x51e
ADUIGP.DLL!DllGetClassObject+0xeef
ADUIGP.DLL!DllCanUnloadNow+0x1441
PS5UI.DLL!DrvDocumentEvent+0xef
WINSPOOL.DRV!Ordinal100+0x20b
WINSPOOL.DRV!DeletePortW+0x2d0
WINSPOOL.DRV!DocumentEvent+0x213
GDI32.dll!ExtFloodFill+0x16b
GDI32.dll!StartDocW+0x58b
notepad.exe+0xa24c
notepad.exe+0x7701
notepad.exe+0x23e8
notepad.exe+0x14eb
USER32.dll!GetSystemMetrics+0x2b1
USER32.dll!GetSystemMetrics+0x4fa
notepad.exe+0x10bc
notepad.exe+0x133c
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
4

2 回答 2

1

创建您自己的端口监视器,以提供更好的对话。您可以使用 WDK 中的示例端口监视器作为它的基础。

于 2012-07-07T19:40:38.900 回答
0

实现扩展 WDK XPSDrvSample 的需求并将 inf 文件更改为指向另一个位置,以确保打印机所需的所有文件都是“新鲜的”,这样做您将避免基本对话框。现在您必须使用自定义端口监视器或使用添加到管道路径的流过滤器来实现自己的保存对话框。

祝你好运 !

PD:您也可以使用 redmon 将输出重定向到外部应用程序以管理输出。

于 2012-07-10T19:38:16.580 回答