2012-07-05 5 views
0

XPS 필터 파이프 라인을 사용하여 XPS 스풀 파일을 다른 PDL로 변환하여 디스크에 저장하는 버전 3 가상 프린터 드라이버를 만들려고합니다.기본 'Print to File'포트의 저장 대화 상자를 어떻게 무시할 수 있습니까?

(파이프 라인 필터를 사용하는) 변환 측면에서는 문제가 없지만 저장할 경로를 선택하라는 대화 상자를 사용자에게 표시 할 때는 무엇이 가장 좋은지 잘 모르겠습니다.

나는 내가 내 가상 프린터를 할당 할 때, 스풀러가 작업이 인쇄 대기열에 도달하기 전에 기본 윈도우 7에 다음과 같은 대화를 저장 표시됩니다 :) 포트 (FILE '을 인쇄 파일로'알고 :

Default save dialog

기본값은 너무 조금 기본적인 것입니다. 특정 프린터 드라이버에 대한이 기본 저장 대화 상자를 덮어 쓰고 내 자신의 전체 저장 대화 상자를 제공하는 방법이 있습니까?

고맙습니다. 코멘트

의 이익을 위해

앤디

업데이트이 표시되어 메모장에서 메인 스레드 대화 상자를 저장 무대 Adobe PDF 프린터와에 인쇄의 호출 스택입니다 . 이 호출 스택에 대한 나의 해석은 저장 대화 상자가 표시 될 때 포트 모니터 라이브러리가 스테이지에 포함되어 있지 않다는 것입니다. 내 해석이 맞습니까? 그렇다면 Adobe PDF Printer에 사용자 정의 저장 대화 상자가 표시됩니다.

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 측면은 포트를 추가/제거하기위한 것입니다. 포트 모니터에 저장 대화 상자를 표시하는 것은 내가 읽은 것에서 약간 해킹 된 것처럼 보입니다. – Andy

+0

포트 모니터는 스풀러 프로세스의 일부로 실행됩니다. 포트 모니터의 UI 측면에서 저장 대화 상자를 표시하는 것에 관한 해킹이 전혀 없습니다. 거의 모든 인쇄물 솔루션이 구현되는 방식입니다 (FILE : 포트, Adobe PDF 등). 인쇄 작업에서 출력을 지시해야하는 경우 포트 모니터가 정확하게 수행 할 수 있습니다. Hacky는 프린터 드라이버에서 그런 대화 상자를 표시하려고합니다. –

+0

내가 모르는 뭔가가 있어야합니다 추측 해요,하지만 어도비 PDF 프린터는 (적어도 GDI 인쇄의 경우) StartDocPre 이벤트 기간 동안 대화를 저장의 표시 것 같다. 나는 그들이 IPrintOemUI2 :: 된 DocumentEvent 방법을 구현하고 DOCUMENTEVENT_STARTDOCPOST을 듣고 있었다 추측했다. 나는이 모든 기초를 잘 이해하고 있다고 생각하고 싶습니다하지만 모든 문서는 평균 개발자가없는 사실을 알고 가정합니다. 너무 초조해. – Andy

0

그래서 당신은 기본적인 대화를 피할 것하고는 WDK XPSDrvSample을 확장 요구를 구현하고 모든 프린터 필요 "신선한"입니다 파일을 수 있도록 다른 위치를 가리 키도록 INF 파일을 변경합니다. 이제 사용자 지정 포트 모니터를 사용하거나 파이프 라인 경로에 추가 된 스트림 필터를 사용하여 사용자 고유의 저장 대화 상자를 구현해야합니다.

행운을 빈다.

PD : redmon을 사용하여 출력을 외부 앱으로 리디렉션하여 출력을 관리 할 수도 있습니다.

+0

XPSDrv 샘플을 이해 합니다만, '사용자 지정 포트 모니터를 사용하여 저장 대화 상자를 구현하십시오'라고 말하면, 내 연구 결과 에서처럼 잘 정의 된 방법이 없다고 말할 수 있습니다! ;) 당신이 어디에 넣을 지 정교 할 수 있습니까? 포트 모니터에 저장 대화 상자를 두는 것이 바람직하지 않은 '인쇄'단계에서 인쇄를 막을 수 있습니다. 파이프 라인 필터에 저장 대화 상자를 구현하는 것은 다소 이상하게 느껴지 나 그것을 조사 할 수 있습니다! 필자는 어딘가에서 필터 UI가 Vista에서만 지원된다는 것을 기억하고 있지만 나중에 XP를 지원해야합니다! – Andy

+0

'스풀링'단계에서 '인쇄'단계에서 작동하는 다른 필터와 달리 '스트림'필터가 실행됩니까? – Andy

+0

그래, 여기 문서를 읽는 것만으로 : http : //msdn.microsoft.com/en-us/library/windows/hardware/gg463364.aspx ... 필터는 사용자에게 비동기 UI 만 표시 할 수 있으므로 차단 저장 대화 상자가 문제가 될 것입니다. 그것은 또한 비스타와 나중에 말한다. – Andy