IE 網頁截圖是瀏覽器程式設計的經典議題。IE9 引入硬體加速後,傳統 GDI 截圖面臨相容性挑戰。經重構核心代碼,現可完美支援開啟硬體加速的環境。本文整理三種主流截圖介面,供開發者依需求選擇。
需截取特定 HTML 元素(如某個 `
| 優點 | 缺點 |
|---|---|
| 可精確截取指定元素 | 需判斷文件模式(Standards/Quirks) |
| 僅支援螢幕顯示大小,不支援縮放 | |
| 框架頁或內嵌 PDF/文件可能失敗 |
需整頁截圖並支援縮放(如產生縮圖、列印預覽)。
IHTMLDocument2* pDoc = ...;
IViewObject* pViewObject = NULL;
pDoc->QueryInterface(IID_IViewObject, (void**)&pViewObject);
pViewObject->Draw(DVASPECT_CONTENT, 1, NULL, NULL,
hScreenDC, hImageDC, &rcSource, NULL, NULL, 0);
| 優點 | 缺點 |
|---|---|
| 支援任意縮放,IE 內部自動處理 | 計算縮放較慢,效能較差 |
| 僅能截取可見區域,無法指定元素 | |
| 第三方 ActiveX 未實作 IViewObject 會缺失 |
追求內容完整度最高,包含所有 ActiveX、外掛內容,且不需縮放。
IWebBrowser2* pWebBrowser2 = ...;
HWND hTridentWnd = NULL;
IOleWindow* pOleWin = NULL;
pWebBrowser2->QueryInterface(IID_PPV_ARGS(&pOleWin));
pOleWin->GetWindow(&hTridentWnd); // 取得 Trident 視窗句柄 (Class: "Internet Explorer_Server")
::PrintWindow(hTridentWnd, hImageDC, PW_CLIENTONLY);
| 優點 | 缺點 |
|---|---|
| 內容最完整,ActiveX 皆可截取 | 不支援縮放,固定螢幕尺寸 |
| 實作最簡單 | 速度不如 DrawToDC |
| 需求 | 首選方案 | 備選方案 |
|---|---|---|
| 一般網頁截圖、需完整內容 | PrintWindow | IViewObject::Draw |
| 需要縮放/產生縮圖 | IViewObject::Draw | |
| 截取特定元素 | IHTMLElementRender::DrawToDC |