如何覆盖默认的“打印到文件”端口的保存对话框?

时间:2012-07-05 15:51:01

标签: winapi printing driver port spooler

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

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

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

Default save dialog

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

非常感谢!

安迪

更新评论的好处

这是打印到Adobe 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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

祝你好运!

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