IE瀏覽器整頁截圖程式

2022-01-19 03:48:44 字數 3747 閱讀 4017

最近專案中涉及到瀏覽器整頁截圖的功能,有點複雜,研究了一天,終於在ie瀏覽器下實現,至於其他瀏覽器,以後再研究。

所謂整頁截圖,就是說把整個頁面全部截進去,包括通過滾動才能看到的部分。

方法是好的,悲催的是,沒有乙個**是能正常執行的,相信很多人都有同感!沒辦法,自己動手,豐衣足食。

我需要用.net來實現。分析一下,主要有以下幾個技術點:

1、如何取得瀏覽器物件。首先要確定ie版本,我用的是ie8瀏覽器,物件結構和ie6、ie7有點區別。這個可以通過win32api中的findwindow函式來實現。

2、對指定控制項截圖。這個可以通過win32api中的printwindow函式來實現,這個函式有乙個優點:即使瀏覽器被其它視窗擋住,也可以正常截圖。但是,如果瀏覽器視窗最小化了,那就漆黑一片了。。。

3、合併。這個用gdi+可以很方便地實現。在記憶體中建立乙個大的畫布,然後將從上至下依次畫上去即可。

開始動手。

首先,建立乙個console應用程式(用form程式也沒關係)。

(1)新增對system.drawing和system.windows.forms的引用。

(2)新增對兩個com元件的引用:shdocvw、mshtml,並設定屬性「嵌入互操作型別」為false(這個很重要,否則無法接下來的程式無法編譯通過)。

(3)將程式入口main方法標記為[stathread](這個也很重要,否則接下來的程式會執行失敗)。

然後,加入win32api類,該類對幾個重要的api進行了封裝,接下來我們會用到這些api。**如下:

using

system;

using

system.runtime.interopservices;

namespace

iecapture}}

最後,加入主程式。**邏輯如下:

(1)獲取當前ie瀏覽器物件。

(2)獲取瀏覽器核心控制項的矩形區域,計算整個頁面一共有多少屏。

(3)通過滾動視窗的方式,對每一屏的頁面進行截圖。

(4)將所有合併為一張整的。

主程式的源**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.drawing;

using

system.windows.forms;

namespace

iecapture

//查詢瀏覽器核心控制項

intptr childhandle1 = win32api.findwindowex(new intptr(webbrowser.hwnd), intptr.zero, "

frame tab

", intptr.zero);

intptr childhandle2 = win32api.findwindowex(childhandle1, intptr.zero, "

tabwindowclass

", intptr.zero);

intptr childhandle3 = win32api.findwindowex(childhandle2, intptr.zero, "

shell docobject view

", intptr.zero);

intptr childhandle4 = win32api.findwindowex(childhandle3, intptr.zero, "

internet explorer_server

", intptr.zero);

if (childhandle4 ==intptr.zero)

//獲取瀏覽器核心控制項的矩形區域

win32api.rect rc = new

win32api.rect();

win32api.getwindowrect(childhandle4,

refrc);

int pageheight = rc.bottom -rc.top;

//獲取html文件物件

mshtml.ihtmldocument2 htmldoc =(mshtml.ihtmldocument2)webbrowser.document;

//計算總共有多少頁,以及最後一頁的高度

int pagecount = htmldoc.body.offsetheight /pageheight;

int lastpageheight = htmldoc.body.offsetheight %pageheight;

if (lastpageheight > 0) pagecount++;

int scrollbarwidth = pagecount > 1 ? systeminformation.verticalscrollbarwidth : 0

;

//列表,用於放置每一屏的截圖

listpageimages = new list();

//一頁一頁地滾動截圖

htmldoc.parentwindow.scrollto(0, 0

);

for (int pageindex = 0; pageindex < pagecount; pageindex++)

htmldoc.parentwindow.scrollby(

0, pageheight);

}//拼接所有

image fullimage =mergeimages(pageimages);

if (fullimage == null

)

//將截圖儲存到指定目錄

try

finally

console.readline();

}//////

合併。

/// ///

列表。 ///

合併後的。

static image mergeimages(listimagelist)

}return

fullimage;

}//////

獲取的指定區域。

/// ///

原始。 ///

目標區域。

///static

image getimagebyrect(image image, rectangle rect)

return

bitmap;

}//////

為指定視窗或控制項截圖。

/// ///

控制代碼。 ///

截圖。 static

image capturewindow(intptr hwnd)}}

【總結】

(1)僅在ie8瀏覽器上測試通過,無法在firefox、chrome上執行。即使同是ie家族的ie6、ie7、ie9,我也不敢保證能正常執行,各位同學可以測試一下,並嘗試修改,歡迎交流。

(2)如果有浮動div隨著頁面一起滾動,在每一屏上都會被截圖。

(3)未考慮水平滾動條的影響。

(4)未考慮在多執行緒環境下的應用。

最後附上乙個cnblogs.com首頁的截圖,看看效果:)

IE瀏覽器整頁截圖程式(二)

實現步驟如下 1 新建乙個form應用程式,在窗體上新增乙個panel,假設name為panel1,設定 panel1.autoscroll true。2 在panel1中放置乙個webbrowser控制項,假設name為webbrowser1,設定 webbrowser1.scripterrors...

瀏覽器長截圖

利用chrome瀏覽的開發者工具,完美實現網頁全屏截圖,不需要安裝任何外掛程式,大家快來試試吧。ctrl shift i f12 ctrl shift p 輸入 screen 選擇不用的方式擷取 整個網頁 capture full size screenshot 節點網頁 capture node ...

selenium實現瀏覽器截圖,拖拽頁面元素

1.實現瀏覽器截圖 呼叫getscreenshotas方法把當前瀏覽器開啟的頁面進行截圖,儲存到file物件中 file scrfile takesscreenshot driver getscreenshotas outputtype.file try catch ioexception e 2....