• <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>
            1. BitBlt

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

            2. Mirror driver

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


            3. GDI hook

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

            4. Windows Media API

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

            5. DirectX

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

            6. PrintWindow

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

            7. DWM/Dxgi hook

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

            8. Magnification

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

            9. Desktop Duplication  

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


            10. GetWindowDC 

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


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

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

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

            這兩個不是同一種方法嗎?  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2014-02-12 20:02 | Richard Wei
            @allen
            BitBlt主要針對Monitor DC, 抓某個Monitor的屏幕內(nèi)容
            WindowDC可以抓任何一個窗口的內(nèi)容, 當(dāng)然抓時也要BitBlt  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2015-07-18 09:40 | 龍門外的魚
            絕對的受教了,最近正愁如何截取一個程序的屏幕  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2015-10-27 22:03 | vigers
            第一種方法剛好解決我的程序有些窗口無法獲取的問題  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)[未登錄]
            2016-07-11 22:07 | 12
            感覺不如佳美迅的桌面共享軟件方便  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2016-07-11 22:08 | 34
            談到桌面共享,沒有哪家技術(shù)能比連通寶的流暢穩(wěn)定  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2016-07-11 22:09 | 34
            不管什么類型的遠程桌面共享技術(shù)都沒有RHUB的方便好用  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2016-07-11 22:10 | 34
            誰說沒有,turbomeeting的效果就很棒  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            2016-07-12 14:26 | chuanhui812
            你采用了那種方法,抓屏的速率怎么樣@龍門外的魚
              回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)
            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主題下幾乎所有電腦都能截到,但是不穩(wěn)定,十次里五次失敗,更嚴重的是,運行一段時間后,一旦失敗,就連續(xù)的十幾秒到十幾分鐘的失敗。請問大神我哪里沒有注意到。應(yīng)該怎么修改。我截圖頻率不高。另,截圖的程序是opengl的  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)[未登錄]
            2016-08-11 23:14 | richard
            @龍門外的魚
            如果目標(biāo)是抓某個被蓋住的窗口內(nèi)容,basic下只能printwindow(不用你上面這么麻煩,直接printwindow就好了),areo下用博文中的最后一種方法  回復(fù)  更多評論
              
            # re: Windows桌面共享中一些常見的抓屏技術(shù)[未登錄]
            2016-08-11 23:22 | richard
            @龍門外的魚
            如果窗口沒蓋住,可以抓整個屏幕后再扣圖。另外printwindow會block我們的程序,調(diào)用前可以給目標(biāo)窗口sendmessagetimeout一個wm_null消息以判斷對方程序有沒有掛起  回復(fù)  更多評論
              
            狠狠色伊人久久精品综合网| 韩国无遮挡三级久久| 久久青青草原国产精品免费 | 久久精品国产亚洲AV香蕉| 久久香蕉综合色一综合色88| 久久精品99久久香蕉国产色戒| 伊人久久综合成人网| 亚洲精品无码成人片久久| 精品无码久久久久国产动漫3d | 色综合色天天久久婷婷基地| 狠狠久久亚洲欧美专区| 亚洲国产精品久久久久婷婷软件| 免费观看久久精彩视频| 97超级碰碰碰碰久久久久| 久久久久一本毛久久久| 一级a性色生活片久久无| 久久精品国产亚洲AV久| 麻豆成人久久精品二区三区免费| 久久国产精品99国产精| 一本色道久久88加勒比—综合| 国内精品久久久久久麻豆| 亚洲国产一成久久精品国产成人综合| 无码任你躁久久久久久久| 亚洲级αV无码毛片久久精品| 久久久久女人精品毛片| 狠狠色综合网站久久久久久久 | 久久久久久久综合日本亚洲| 国产99久久久国产精品~~牛| 色婷婷久久综合中文久久一本| 久久久久se色偷偷亚洲精品av| 久久久久久狠狠丁香| 国产免费久久精品99re丫y| 国产精品久久久久jk制服| 久久久久亚洲AV成人网| 婷婷综合久久中文字幕蜜桃三电影| 国产精品久久波多野结衣| 久久人人爽人人爽人人片AV东京热| 婷婷综合久久中文字幕蜜桃三电影| 色综合久久最新中文字幕| 久久人妻AV中文字幕| 国产精品亚洲美女久久久|