青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

1. BitBlt

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

2. Mirror driver

這種方法應該是Win8之前最高效的抓屏方法, 也是微軟推薦的遠程桌面共享方案,它通過創建虛擬鏡像驅動, 直接獲取最終屏幕變化數據。
該方法也有一些缺點:
a. 涉及到驅動安裝, 技術難度大, 系統權限要求也高
b. Win8 上該方案已經失效, 但是還是有方法的, 參見 Remote Display Drivers


3. GDI hook

這種方法應該說是XP時代比較流行的抓屏方法, 因為所有的繪制都是通過GDI32.dll中的繪圖函數來實現的, 所以我們只要攔截了這些函數, 系統的所有繪制就都讓我們控制了。這種方法應該來說也是一種挺高效的抓屏方法,屏幕的變化也都能讓我們攔截到, 同時因為好多繪圖函數是以矢量方式實現的,所有抓到的數據包非常小, 即使在低帶寬下也效果挺好。
下面是該方法的一些缺點:
a. Hook技術本身就有其復雜性和不穩定性, 尤其是Hook所有進程
b. Vista只有越來越多程序采用D2D/D3D繪制, GDI Hook對這些繪制無能為力。
c. Vista之后UAC打開的情況下, 如果我們的程序權限不夠高, Hook不到更高權限的程序。

4. Windows Media API

Windows Media 9.0 支持用Windows Media Encoder 9 API來抓屏。它有一個編碼器叫Windows Media Video 9 Screen codec,特別為抓屏優化過。Windows Media Encoder API提供了一個IWMEncoder2接口可以用來高效地捕捉屏幕圖像。
因為對這組API不熟, 這種抓屏方法我也沒嘗試過, 具體可見Various methods for capturing the screen, 感覺這種方法的最大缺點是用戶機器需要安裝Windows Media Encoder 9。

5. DirectX

每個DirectX程序都包含一個被我們稱作緩沖的內存區域,其中保存了和該程序有關的顯存內容,這在程序中被稱作后臺緩沖(Back Buffer),有些程序有不止一個的后臺緩沖。還有一個緩沖,在默認情況下每個程序都可以訪問-前臺緩沖。前臺緩沖保存了和桌面相關的顯存內容,實質上就是屏幕圖像。 我們的程序通過訪問前臺緩沖就可以捕捉到當前屏幕的內容。上面的列子中也包含該方法的實現, 是基于DirectX9的,我們可以參考下, 據我測試該方法在DWM打開的情況下抓整屏也要30ms左右。Vista之后的DirectX 10/11相對于DirectX 9 已經發生非常大的變化, 直接用新的接口上面的代碼未必能正常工作。

6. PrintWindow

該方法本身不能直接做為一種抓屏方法, 但是有時候我們要獲取某個窗口的內容, 即使他被其他窗口覆蓋著, 這時候這個函數就很有用。該方該調用法的原理是通過給目標窗口發送WM_PRINT或是WM_PRINTCLIENT消息, 所以如果目標窗口沒有響應, 該調用可能會阻塞抓屏線程, 這種情況下抓屏前最好先用SendMessageTimeout檢測目標窗口是否有響應。另外該方法也抓不到D3D窗口的內容。

7. DWM/Dxgi hook

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

8. Magnification

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

9. Desktop Duplication  

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


10. GetWindowDC 

該方法和PrintWindow類似,但是它沒有PrintWindow的權限問題, 也沒有超時問題。
這種抓屏方法在Win7/Win8  DWM打開的情況下抓屏,結果會顛覆我們XP時代的知識, 因為即使窗口被覆蓋, 它也可以正確抓取到被覆蓋窗口下的內容, WebRTC正是用這種方式來Share  Application的。
它的主要問題是有些窗口抓到的內容不包含非客戶區,有些窗口比如任務欄的Thumbnail窗口會抓不到內容。


最后簡單總結下 , 我們可以看到Windows系統上基本沒有一種通用的抓屏技術可以高效的抓取所有的系統(XP/Win7/Win8), 很大一部原因是操作系統的顯示驅動模型在從XPDM向WDDM轉變, 應用層的API也在從GDI向D3D轉變 。 相對于Linux的穩定, Window的不斷發展和進步, 對開發人員究竟是喜是悲?

posted on 2013-12-01 22:04 Richard Wei 閱讀(39172) 評論(16)  編輯 收藏 引用 所屬分類: windows desktop

FeedBack:
# re: Windows桌面共享中一些常見的抓屏技術
2013-12-01 22:17 | 萬連文
遠程桌面協議(RDP) 不知道算不算?  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2013-12-02 10:46 | Richard Wei
@萬連文
RDP協議是不公開的,他主要定義了圖像的壓縮,加密,傳輸和遠程控制等方法, 本身沒有定義屏幕采樣方法,微軟的遠程桌面用的應該是mirror driver的抓屏。  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術[未登錄]
2013-12-02 14:43 | Q
Mirror驅動在win8上不是失效,只是默認沒有安裝,還是可以用的  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2013-12-02 18:57 | Richard Wei
@Q
多謝指正, 因為具體我也沒試過, 只是看微軟文檔得出的結論,可看這里第一句:http://msdn.microsoft.com/en-us/library/windows/desktop/hh404487(v=vs.85).aspx  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2014-02-12 16:40 | allen
1,BitBlt
10. GetWindowDC

這兩個不是同一種方法嗎?  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2014-02-12 20:02 | Richard Wei
@allen
BitBlt主要針對Monitor DC, 抓某個Monitor的屏幕內容
WindowDC可以抓任何一個窗口的內容, 當然抓時也要BitBlt  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2015-07-18 09:40 | 龍門外的魚
絕對的受教了,最近正愁如何截取一個程序的屏幕  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2015-10-27 22:03 | vigers
第一種方法剛好解決我的程序有些窗口無法獲取的問題  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術[未登錄]
2016-07-11 22:07 | 12
感覺不如佳美迅的桌面共享軟件方便  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2016-07-11 22:08 | 34
談到桌面共享,沒有哪家技術能比連通寶的流暢穩定  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2016-07-11 22:09 | 34
不管什么類型的遠程桌面共享技術都沒有RHUB的方便好用  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2016-07-11 22:10 | 34
誰說沒有,turbomeeting的效果就很棒  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2016-07-12 14:26 | chuanhui812
你采用了那種方法,抓屏的速率怎么樣@龍門外的魚
  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術
2016-08-11 22:51 | 龍門外的魚
大神。我采用
::UpdateWindow(hWnd);
::RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN|RDW_FRAME);
::PrintWindow(hWnd,T_hMemDC,0);
的方式截屏,win7 aero主題下有些電腦截不到,有些可以而且都可以遮擋。basic主題下幾乎所有電腦都能截到,但是不穩定,十次里五次失敗,更嚴重的是,運行一段時間后,一旦失敗,就連續的十幾秒到十幾分鐘的失敗。請問大神我哪里沒有注意到。應該怎么修改。我截圖頻率不高。另,截圖的程序是opengl的  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術[未登錄]
2016-08-11 23:14 | richard
@龍門外的魚
如果目標是抓某個被蓋住的窗口內容,basic下只能printwindow(不用你上面這么麻煩,直接printwindow就好了),areo下用博文中的最后一種方法  回復  更多評論
  
# re: Windows桌面共享中一些常見的抓屏技術[未登錄]
2016-08-11 23:22 | richard
@龍門外的魚
如果窗口沒蓋住,可以抓整個屏幕后再扣圖。另外printwindow會block我們的程序,調用前可以給目標窗口sendmessagetimeout一個wm_null消息以判斷對方程序有沒有掛起  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产另类精品专区| 欧美精品在线视频观看| 欧美成人精品一区二区| 狠狠色狠狠色综合日日tαg| 久久激情视频| 欧美一区二区三区视频免费播放| 国产色婷婷国产综合在线理论片a| 久久精品亚洲一区二区三区浴池| 欧美一区二区三区视频| 在线视频观看日韩| 亚洲激情在线播放| 国产精品入口夜色视频大尺度| 欧美一区二区啪啪| 久久亚洲图片| 在线综合亚洲| 欧美主播一区二区三区| 亚洲区欧美区| 亚洲欧洲精品成人久久奇米网| 国产丝袜美腿一区二区三区| 久久久久九九九九| 欧美成黄导航| 久久av二区| 久久五月激情| 午夜影视日本亚洲欧洲精品| 久久久久久9| 亚洲一区二区综合| 久久国产精品久久国产精品| 亚洲伦伦在线| 欧美一区二区成人6969| 亚洲精品久久| 欧美中日韩免费视频| 欧美激情第8页| 久久久精品国产免费观看同学 | 久久久久久亚洲精品杨幂换脸| 久久资源在线| 中文久久精品| 久久综合狠狠综合久久综青草| 亚洲在线播放电影| 麻豆成人av| 亚洲欧美日韩在线高清直播| 免费高清在线视频一区·| 欧美亚洲一区三区| 欧美日韩国产成人精品| 麻豆国产精品va在线观看不卡| 欧美体内谢she精2性欧美| 亚洲福利视频网站| 国产午夜精品在线观看| 亚洲精品久久久蜜桃| 国户精品久久久久久久久久久不卡 | 一区二区免费看| 久久岛国电影| 欧美在线免费视屏| 国产精品成人观看视频国产奇米| 欧美1区2区3区| 黑丝一区二区三区| 午夜精品久久久久久久男人的天堂| 亚洲精品在线免费| 久久久午夜精品| 久久不射网站| 国产色产综合产在线视频| 亚洲欧美日韩国产一区| 午夜日本精品| 国产九九精品视频| 午夜精品999| 久久久青草婷婷精品综合日韩 | 免费欧美网站| 欧美成人一区二免费视频软件| 精品动漫一区二区| 久久嫩草精品久久久精品一| 噜噜噜噜噜久久久久久91| 狠狠综合久久| 欧美一区二区三区四区在线观看地址| 欧美伊人久久久久久久久影院| 欧美四级电影网站| 一本色道久久88综合亚洲精品ⅰ | 亚洲日韩欧美视频| 欧美韩日亚洲| 夜夜嗨av一区二区三区四季av| 亚洲一区二区三区精品动漫| 国产精品拍天天在线| 欧美成人免费全部观看天天性色| 性欧美办公室18xxxxhd| 欧美在线播放| 激情综合色丁香一区二区| 浪潮色综合久久天堂| 亚洲区第一页| 亚洲综合视频一区| 国产一区二区三区四区在线观看 | 亚洲欧洲精品一区二区三区| 一区电影在线观看| 国产精品综合视频| 久久综合综合久久综合| 亚洲日本中文字幕免费在线不卡| 午夜国产精品视频免费体验区| 狠狠爱综合网| 欧美福利视频在线| 亚洲一区在线免费| 欧美成人免费在线视频| 亚洲综合国产| 一区二区三区在线免费观看| 欧美麻豆久久久久久中文| 在线视频亚洲一区| 久久一区精品| 亚洲图片激情小说| 激情另类综合| 国产精品日韩欧美大师| 免费久久99精品国产自| 亚洲一区二区三区午夜| 欧美高清视频在线| 欧美亚洲综合网| 99re66热这里只有精品3直播| 国产亚洲欧美在线| 欧美日韩在线免费观看| 久久精品在线免费观看| 亚洲线精品一区二区三区八戒| 欧美大片第1页| 久久国产精品亚洲77777| 老司机午夜免费精品视频| 午夜精品亚洲| 一片黄亚洲嫩模| 亚洲国产成人tv| 国产在线国偷精品产拍免费yy| 欧美视频精品在线| 欧美电影在线观看完整版| 午夜精品久久久久久久99黑人| 亚洲欧洲一级| 欧美va亚洲va国产综合| 久久久久国产一区二区三区| 小嫩嫩精品导航| aⅴ色国产欧美| 亚洲美女视频在线观看| 亚洲黄网站黄| 亚洲国产日韩欧美在线图片| 国产伦精品一区二区三| 欧美日韩一区二区三| 蜜臀av国产精品久久久久| 久久av一区二区三区漫画| 欧美一区二区免费| 亚洲欧美激情精品一区二区| 亚洲视频一区在线观看| 在线亚洲免费| 亚洲自拍偷拍麻豆| 亚洲一区二区高清| 亚洲欧美成人在线| 亚洲免费在线电影| 香蕉精品999视频一区二区| 亚洲一区999| 亚洲欧美影院| 久久本道综合色狠狠五月| 欧美一区视频| 久久天天狠狠| 欧美精品乱码久久久久久按摩| 欧美精品久久99| 欧美日韩视频在线一区二区观看视频| 欧美日韩不卡在线| 欧美日韩视频一区二区| 国产精品va在线播放我和闺蜜| 国产精品欧美日韩一区二区| 国产夜色精品一区二区av| 一区二区亚洲精品国产| 亚洲国产精品女人久久久| 亚洲欧美国产精品va在线观看| 亚洲网址在线| 亚洲国内精品| 国产在线观看精品一区二区三区| 亚洲高清不卡在线| 在线电影院国产精品| 亚洲你懂的在线视频| 日韩小视频在线观看专区| 久久se精品一区二区| 欧美中文字幕在线| 欧美三级在线播放| 亚洲欧美一区二区三区极速播放| 亚洲午夜精品网| 亚洲最新在线| 久久精品国产69国产精品亚洲| 免费看精品久久片| 国产精品xxxav免费视频| 久久综合国产精品| 国产精品xvideos88| 亚洲高清成人| 久久国产精品99久久久久久老狼| 欧美刺激性大交免费视频| 一区二区三区回区在观看免费视频| 香蕉免费一区二区三区在线观看| 欧美成人中文| 激情欧美一区二区三区| 亚洲一区二区三区精品视频 | 国产精品拍天天在线| 亚洲国产婷婷香蕉久久久久久| 亚洲欧美美女| 亚洲精品美女在线| 久久精品99国产精品日本| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 亚洲自拍16p| 欧美电影美腿模特1979在线看 | 美女日韩欧美| 国模精品一区二区三区色天香| 一本色道久久综合| 欧美成人免费网站|