<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      厚積薄發(fā)
      海納百川,有容乃大
      1. BitBlt

      我想做Windows開發(fā)應(yīng)該都知道這個(gè)API, 它能實(shí)現(xiàn)DC間的內(nèi)容拷貝, 如果我們把源DC指定成Monitor DC或是桌面DC, 它就能實(shí)現(xiàn)抓屏功能。
      對(duì)于通過這種方式的抓屏, 有2點(diǎn)需要特別提醒:
      a. 在XP下我們可以通過最后的拷貝標(biāo)志來控制是否拷貝layered window, 只有SRCCPY表示拷貝內(nèi)容不包含layered window, 如果是SRCCPY | CAPTUREBLT表示拷貝包括Layered window在內(nèi)的所有窗口。 這個(gè)標(biāo)志在Vista之后的系統(tǒng)(win7/win8),開啟DWM的情況下, 已經(jīng)失效, 因?yàn)檫@種情況下所有的窗口都是layered window.
      b. 這種方式的抓屏在 Vista之后, 開啟DWM的情況下, 抓屏速度非常慢(30ms +), 具體原因不知道是因?yàn)橄到y(tǒng)沒有緩存整個(gè)屏幕的數(shù)據(jù)還是GPU向內(nèi)存拷貝數(shù)據(jù)太慢了, 有知道的朋友可以提示下。

      2. Mirror driver

      這種方法應(yīng)該是Win8之前最高效的抓屏方法, 也是微軟推薦的遠(yuǎn)程桌面共享方案,它通過創(chuàng)建虛擬鏡像驅(qū)動(dòng), 直接獲取最終屏幕變化數(shù)據(jù)。
      該方法也有一些缺點(diǎn):
      a. 涉及到驅(qū)動(dòng)安裝, 技術(shù)難度大, 系統(tǒng)權(quán)限要求也高

      b. Win8 上該方案已經(jīng)失效

       

      3. GDI hook

      這種方法應(yīng)該說是XP時(shí)代比較流行的抓屏方法, 因?yàn)樗械睦L制都是通過GDI32.dll中的繪圖函數(shù)來實(shí)現(xiàn)的, 所以我們只要攔截了這些函數(shù), 系統(tǒng)的所有繪制就都讓我們控制了。這種方法應(yīng)該來說也是一種挺高效的抓屏方法,屏幕的變化也都能讓我們攔截到, 同時(shí)因?yàn)楹枚嗬L圖函數(shù)是以矢量方式實(shí)現(xiàn)的,所有抓到的數(shù)據(jù)包非常小, 即使在低帶寬下也效果挺好。
      下面是該方法的一些缺點(diǎn):
      a. Hook技術(shù)本身就有其復(fù)雜性和不穩(wěn)定性, 尤其是Hook所有進(jìn)程
      b. Vista只有越來越多程序采用D2D/D3D繪制, GDI Hook對(duì)這些繪制無能為力。

      c. Vista之后UAC打開的情況下, 如果我們的程序權(quán)限不夠高, Hook不到更高權(quán)限的程序。

       

      4. Windows Media API

      Windows Media 9.0 支持用Windows Media Encoder 9 API來抓屏。它有一個(gè)編碼器叫Windows Media Video 9 Screen codec,特別為抓屏優(yōu)化過。Windows Media Encoder API提供了一個(gè)IWMEncoder2接口可以用來高效地捕捉屏幕圖像。
      因?yàn)閷?duì)這組API不熟, 這種抓屏方法我也沒嘗試過, 具體可見Various methods for capturing the screen, 感覺這種方法的最大缺點(diǎn)是用戶機(jī)器需要安裝Windows Media Encoder 9。
       
      5. DirectX

      每個(gè)DirectX程序都包含一個(gè)被我們稱作緩沖的內(nèi)存區(qū)域,其中保存了和該程序有關(guān)的顯存內(nèi)容,這在程序中被稱作后臺(tái)緩沖(Back Buffer),有些程序有不止一個(gè)的后臺(tái)緩沖。還有一個(gè)緩沖,在默認(rèn)情況下每個(gè)程序都可以訪問-前臺(tái)緩沖。前臺(tái)緩沖保存了和桌面相關(guān)的顯存內(nèi)容,實(shí)質(zhì)上就是屏幕圖像。 我們的程序通過訪問前臺(tái)緩沖就可以捕捉到當(dāng)前屏幕的內(nèi)容。上面的列子中也包含該方法的實(shí)現(xiàn), 是基于DirectX9的,我們可以參考下。
      Vista之后的DirectX 10/11相對(duì)于DirectX 9 已經(jīng)發(fā)生非常大的變化, 直接用新的接口上面的代碼未必能正常工作, 但是COM的優(yōu)點(diǎn)就是我們可以在新的組件中依然調(diào)用老的接口。
       
      6. PrintWindow

      該方法本身不能直接做為一種抓屏方法, 但是有時(shí)候我們要獲取某個(gè)窗口的內(nèi)容, 即使他被其他窗口覆蓋著, 這時(shí)候這個(gè)函數(shù)就很有用。該方該調(diào)用法的原理是通過給目標(biāo)窗口發(fā)送WM_PRINT或是WM_PRINTCLIENT消息, 所以如果目標(biāo)窗口沒有響應(yīng), 該調(diào)用可能會(huì)阻塞抓屏線程, 這種情況下抓屏前最好先用SendMessageTimeout檢測目標(biāo)窗口是否有響應(yīng)。另外該方法也抓不到D3D窗口的內(nèi)容。
       
      7. DWM/Dxgi hook

      Vista之后微軟放棄了XP時(shí)代的XPDM, 采用了全新的WDDM視屏驅(qū)動(dòng)模型, 現(xiàn)在Win8.1上已經(jīng)是WDDM1.3.
      Vista之后底層所有的渲染都是基于D3D技術(shù), 另外我們也知道系統(tǒng)在DWM.exe里進(jìn)行窗口邊框的繪畫和合成, 所以理論上我們可以通過HOOK DWM/D3D/DXGI,攔截到整個(gè)系統(tǒng)的屏幕內(nèi)容。當(dāng)然作為一種Hook技術(shù), 它也有上面GDI Hook類似的問題。
       
      8. Magnification

      這組API是微軟Vista之后開放給我們開發(fā)放大鏡程序的, 它里面提供了一個(gè)API讓我們攔截到顯示的內(nèi)容, 可惜的是這個(gè)關(guān)鍵的API  MagSetImageScalingCallback 微軟已經(jīng)宣布作廢。另外該方式的抓屏效率也不高, 整屏需要60 ms 左右。
       
      9. Desktop Duplication  

      這是微軟Win8 上宣布放棄Mirror driver之后推薦采用的抓屏技術(shù), 全部基于D3D/DXGI技術(shù), 效率非常高, 并且包含變化區(qū)域和屏幕鼠標(biāo)光標(biāo)。它的缺點(diǎn)是沒法抓取某個(gè)窗口的內(nèi)容 。
       

       10. GetWindowDC 


      該方法和PrintWindow類似,但是它沒有PrintWindow的權(quán)限問題, 也沒有超時(shí)問題。
      這種抓屏方法在Win7/Win8  DWM打開的情況下抓屏,結(jié)果會(huì)顛覆我們XP時(shí)代的知識(shí), 因?yàn)榧词勾翱诒桓采w, 它也可以正確抓取到被覆蓋窗口下的內(nèi)容, WebRTC正是用這種方式來Share  Application的。
      它的主要問題是有些窗口抓到的內(nèi)容不包含非客戶區(qū),有些窗口比如任務(wù)欄的Thumbnail窗口會(huì)抓不到內(nèi)容。

       

      最后簡單總結(jié)下 , 我們可以看到Windows系統(tǒng)上基本沒有一種通用的抓屏技術(shù)可以高效的抓取所有的系統(tǒng)(XP/Win7/Win8), 很大一部原因是操作系統(tǒng)的顯示驅(qū)動(dòng)模型在從XPDM向WDDM轉(zhuǎn)變, 應(yīng)用層的API也在從GDI向D3D轉(zhuǎn)變 。 相對(duì)于Linux的穩(wěn)定, Window的不斷發(fā)展和進(jìn)步, 對(duì)開發(fā)人員究竟是喜是悲?

      posted on 2013-12-01 22:13  Richard Wei  閱讀(3215)  評(píng)論(1)    收藏  舉報(bào)

      主站蜘蛛池模板: 日韩人妻精品中文字幕专区 | 国产成人一区二区不卡| 97久久精品人人做人人爽| 国产精品国语对白露脸在线播放 | 亚洲国产成人久久综合区| 饶平县| 精品国产精品国产偷麻豆| 久久91精品牛牛| 最新的国产成人精品2020| 亚洲天堂领先自拍视频网| 日本一区三区高清视频| 国产欧美在线手机视频| 彭水| 乱老年女人伦免费视频| 中文字幕一区二区三区久久蜜桃| 久9视频这里只有精品试看| 变态另类视频一区二区三区| 国产SM重味一区二区三区| 水蜜桃视频在线观看免费18 | 色欲av久久一区二区三区久| 久久av无码精品人妻系列试探| 亚洲大尺度视频在线播放| 高清自拍亚洲精品二区| 成人午夜看黄在线尤物成人| 中文字幕一区二区三区精华液| 五月婷婷中文字幕| 亚洲AV无码秘?蜜桃蘑菇| 元谋县| 和艳妇在厨房好爽在线观看| 中文熟妇人妻av在线| 风流少妇树林打野战视频| 色94色欧美sute亚洲线路二| 四虎影视久久久免费| 亚洲一区二区av高清| 亚洲一区二区三区在线观看精品中文| 蜜臀av久久国产午夜| 亚洲毛片多多影院| 亚洲精品国产一区二区三区在线观看 | 午夜福利电影| 色窝窝免费一区二区三区| 亚洲人妻一区二区精品|