2013-03-06 183 views
2

我在本機C++/Win32/MFC對話框應用程序中使用MS Web瀏覽器ActiveX控件來通過HTML呈現某些信息。Microsoft Web瀏覽器ActiveX控件 - 打印到指定的(非默認)打印機

我想打印的內容沒有任何用戶交互到指定的打印機(這不是默認打印機)。我想使用的打印機是PDF打印機。

我在Code Project中使用了一個很好的包裝類,它使得使用Web瀏覽器控件更容易一些(http://www.codeproject.com/Articles/3919/Using-the-WebBrowser-control-simplified),並且包裝器提供的其中一個功能是打印。它提供了一種使用ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,...)打印內容的打印方法。

這很好,並導致控件的內容被打印到默認打印機,而無需任何用戶交互。

接下來的挑戰是讓它使用與默認不同的打印機。我最初的嘗試是打電話:: SetDefaultPrinter(http://msdn.microsoft.com/en-us/library/windows/desktop/dd162971(v=vs.85).aspx)。這似乎並不奏效。看起來,儘管調用:: SetDefaultPrinter,Web瀏覽器ActiveX控件仍然打印到系統默認打印機。就好像它忽略了這個呼叫所做的一樣。

我試着按照MSDN鏈接中的建議廣播系統設置更改消息,並直接發送給瀏覽器窗口,但沒有任何運氣。

任何想法如何我可以讓Web瀏覽器的ActiveX控件來打印打印機我指定,而不是使用默認打印機?

回答

1

我做什麼除了您的所有步驟設置在IE註冊表中的打印機,在這裏:

HKCU\Software\Microsoft\Internet Explorer\PageSetup\printer="the required printer name" 

和印刷

+0

更新:看起來像沒有這樣做。在離開前的前一天,我手動將PDF打印機設置爲默認打印機。我忘了把它放回去,並嘗試你的建議,它的工作。但僅僅是因爲PDF打印機被手動設置爲系統默認值。當我將默認設置切換回物理打印機時,上述操作無效。即使在打印之前設置註冊表項,瀏覽器控件仍然會將文檔打印到系統默認打印機。 – Nerdtron 2013-03-06 20:10:28

+0

我知道它的工作原理;註冊表關鍵是沒有必要的,也不足以從我的測試。我將添加爲我工作的解決方案。 – Nerdtron 2013-03-06 21:06:35

+0

它在某些情況下可能需要註冊表的東西;不知道,但對我來說,這似乎並不重要。即使使用註冊表鍵,我仍然必須首先設置默認打印機,即使沒有註冊表,它仍然可以工作,一旦我找出問題所在。 – Nerdtron 2013-03-06 21:09:38

1

我得到它的工作後恢復一切恢復。問題的原因不在於瀏覽器控件正在打印到錯誤的打印機,而是(通過ExecWB)執行的打印操作是異步執行的。所以,我將默認打印機設置爲PDF打印機,然後啓動打印,然後恢復原始默認打印機。這種情況發生得非常快,在異步打印操作準備就緒後,原來的默認打印機再次被設置爲默認打印機,因此它將轉到該打印機。

該解決方案已將默認打印機設置爲PDF打印機,開始打印,然後等待打印完成回調。一旦收到回調,它就會恢復原來的默認打印機。

如果您在代碼項目上使用Gary Wheeler的優秀Web瀏覽器控件(請參閱here),您可以非常輕鬆地獲得打印完成回調,您只需重寫虛擬OnPrintTemplateTeardown()方法即可。