屏幕截圖在一些辦公、IM、遠程登陸與控制、視頻等軟件中經常使用,通過屏幕抓拍完成屏幕遠程共享、保存成圖像文件或視頻文件。通過使用GDI截屏與DfMirage後,對兩種屏幕截圖方法做些比較和總結:
GDI截屏
GDI(graphics device interface)是window提供的api函數,用於設備上下文繪製圖形。sourceforge上有個屏幕錄製開源程序,應該是叫Cam Studio,用的就是GDI截屏,可供參考。
使用步驟:
1、獲取屏幕句柄
WINAPI函數::GetDesktopWindow()
2、獲取屏幕DC
WINAPI函數:GetDC
3、通過BitBlt函數將屏幕圖像複製到DC中
4、通過GetDIBits獲取截圖的位圖數據
特點:簡單易用,開發方便,但cpu佔用率高、數據量大
DfMirage截屏
開源項目TightVNC是應用DfMirage的一個例子,tightvnc-1.3.10支持DfMirage截屏,大家可以參考代碼學習,最新版的tightvnc好像不支持DfMirage。
DfMirage是Windows NT操作系統家族的的視頻驅動鏡像技術,視頻驅動鏡像技術廣泛採用於遠程桌面應用程序,如NetMeeting, PC Anywhere, VNC, Webex等等。
相對於GDI屏幕抓取,鏡像截屏是一個技術上很優越的方法,通過虛擬驅動,系統發往顯卡的命令也發給虛擬驅動,在虛擬驅動中模擬出當前系統的顯示內容。
DfMirage驅動程序將屏幕表面映射到的用戶的應用程序的虛擬內存空間,DfMirage跟蹤屏幕最小的更新區域和用戶軟件能直接檢索到這些區域,也就是說虛擬驅動和應用軟件共享屏幕內存。通常情況下,緩衝區的大小和格式完全對應的主屏幕表面的格式和大小。DfMirage能檢索到只發生數據改變的區域,同時應用程序也能讀取到整個屏幕緩衝區。可以使用DfMirage驅動程序解決需要高效率的檢測屏幕變化區域的應用。
使用步驟
1、安裝DfMirage驅動
2、應用程序通過ExtEscape()Windows API函數與DfMirage驅動通信
DfMirage定義了一些私有escape編碼。Escape函數代碼和輸入輸出結構體在DfMirage提供的display-esc.h頭文件裏面聲明(這是一個供驅動程序和應用程序之間共同使用的接口頭文件)
特點:效率高,節省CPU使用率