2012-07-05 232 views
0

我試圖創建一個版本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 

回答

0

創建自己的port monitor,提供更好的對話。您可以使用WDK中的示例端口監視器作爲其基礎。

+0

我不認爲它是端口監視器,但對話框來自不過,是不是假脫機系統顯示對話框?就我而言,端口監視器的UI端僅用於添加/刪除端口。在端口監視器中顯示一個保存對話框看起來有點hacky從我讀過的。 – Andy 2012-07-09 07:43:56

+0

端口監視器作爲假脫機程序進程的一部分運行。關於從端口監視器的UI側顯示保存對話,根本就沒什麼好奇。這是幾乎所有印刷到文件解決方案的實施方式(FILE:端口,Adobe PDF等)。如果您需要從打印作業中直接輸出,則端口監視器正是要執行此操作的地方。 Hacky會嘗試從打印驅動程序顯示這樣的對話框。 – 2012-07-09 14:14:58

+0

我猜我一定是失去了一些東西,但它似乎是Adobe PDF打印機顯示它的StartDocPre事件(至少GDI打印)中保存對話。我猜測他們正在實施IPrintOemUI2 :: DocumentEvent方法並正在偵聽DOCUMENTEVENT_STARTDOCPOST。我想我認爲我對這一切的基礎知識有很好的理解,但是每篇文檔都假設普通開發人員沒有這方面的知識。太令人沮喪了。 – Andy 2012-07-09 15:07:23

0

實現擴展WDK XPSDrvSample您的需求和改變inf文件指向另一個位置,以確保所有文件的打印機的需求是「新鮮」,這樣做你會避免基本的對話。現在您必須使用自定義端口監視器或使用添加到管道路徑的流過濾器來實現自己的保存對話框。

祝你好運!

PD:您也可以使用redmon將輸出重定向到外部應用程序來管理輸出。

+0

我瞭解XPSDrv示例,但是當您說'使用自定義端口監視器實現您自己的保存對話框'時,您會這樣說,因爲它存在明確定義的方式來執行此操作,這從我的研究來看並不正確! ;)你能詳細說明你將它放在哪裏嗎?我確定在端口監視器中放置一個保存對話框會在'打印'階段阻止打印,這是不可取的。在管道過濾器中實現保存對話框感覺有點奇怪,但我可以研究它!雖然我似乎記得我曾經在某個地方看過濾器UI只支持Vista和更高版本,我們需要支持XP! – Andy 2012-07-11 09:44:15

+0

在「假脫機」階段期間是否會運行「流」過濾器,而不是在「打印」階段期間似乎正在運行的其他過濾器? – Andy 2012-07-11 09:45:19

+0

是的,只是在這裏閱讀文檔:http://msdn.microsoft.com/en-us/library/windows/hardware/gg463364.aspx ...它建議過濾器只能向用戶顯示異步UI,所以阻止保存對話框將不成問題。它還說Vista和更高版本。 – Andy 2012-07-11 11:33:31

相關問題