• <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) 通過Desktop DC, 然后BitBlt
            點評: 通過這種方法抓取到的截圖是當前桌面的所有窗口,包括其他當前打開顯示的窗口 , 這不是我們所期望的。
            另外我們也不可能在需要截圖時最小化所有窗口, 截完了再還原。

            (2)通過注冊表獲取桌面壁紙保存的地方
            點評:獲取到該壁紙, 沒有圖標和任務欄, 也不是我們所期望的。

            (3)通過DWM特性來獲取
            點評: Vista后的Desktop Window Manager(DWM)特性,可以讓我們通過DwmRegisterThumbnail,DwmUpdateThumbnailProperties等API實時顯示某個窗口的截圖。可惜獲取到的內容只能顯示在我們預定義的窗口里, 但是我們沒法獲取里面的內容。另外這個特性只有Vista之后才支持, XP系統怎么辦?

            (4)通過Magnification來獲取
            點評:我們可以通過系統的放大鏡技術,
            過濾掉蓋在桌面上的其他窗口(MagSetWindowFilterList),然后通過MagSetImageScalingCallback攔截內容。該技術的問題一是過濾窗口的個數限制, 另外也只能適用于Vista之后。

            (5)通過API Hook技術
            點評:通過API Hook技術我們可以動態攔截桌面窗口DC的繪畫動作,這樣就可以攔截或是合成窗口內容了。但是一來這樣做比較復雜, 穩定性也很難保證,另外也有殺雞用牛刀的感覺。

            (6)通過PrintWindow技術
            點評:PrintWindow API內部通過WM_PRINTCLIENT和WM_PRINT來獲取窗口截圖, 這個API在XP時代工作的不是很好,但是在Vista之后已經比較穩定了。

            我們最后選擇通過PrintWindow API來獲取桌面截圖, 大概過程如下: 
            a. 獲取桌面窗口(Program Manager)的內容
            b. 獲取TaskBar窗口的位置和內容
            c. 把TaskBar窗口內容和桌面內容合成, 貼在正確的位置

            這里說一下要注意的一些問題: 

            a . 注意窗口的層次

            Aero模式下, Program Manager窗口只包含背景圖片, 圖標列表在WorkerW窗口下:

            Basic模式下窗口內容都在Program Manager窗口下:


            b. 注意多顯示器的情況, 多顯示器時除了主顯示器,其他顯示器桌面是沒有任務欄的

            c. 注意任務欄的位置, 任務欄是可以Dock到任何地方并且以隱藏的,不要hard code在下面了。

            d.  XP下對ProgramManager窗口調用PrintWindow會有刷新問題。一直沒有好的解決方案, 所以對XP勉強采用第一種DC的方式了。

            因此, 我到現在還沒有找到完整解決我們這個問題的方法, 不知道大家有沒有好的思路?

            附上我的測試代碼:ScreenSnapshot.rar
            posted on 2013-08-30 20:30 Richard Wei 閱讀(7990) 評論(2)  編輯 收藏 引用 所屬分類: windows desktop

            FeedBack:
            # re: 如何獲取桌面截圖
            2013-09-02 17:16 | 笨笨熊
            發一個顯示桌面的命令,然后再截圖,最后再發一個顯示桌面的命令。。。Over。。。  回復  更多評論
              
            # re: 如何獲取桌面截圖
            2013-09-02 17:52 | Richard Wei
            @笨笨熊
            基本不可能, 這個用戶體驗也太差了吧  回復  更多評論
              
            996久久国产精品线观看| 无夜精品久久久久久| 老司机午夜网站国内精品久久久久久久久 | 久久99精品久久久大学生| 国产伊人久久| 久久精品18| 久久精品国产精品亚洲人人| 国产亚洲美女精品久久久久狼| 久久偷看各类wc女厕嘘嘘| 亚洲国产精品无码久久一线 | 一本一本久久a久久精品综合麻豆| 99久久国产综合精品成人影院| 99re这里只有精品热久久| 久久精品成人免费网站| 久久综合狠狠综合久久激情 | 国产Av激情久久无码天堂| 久久久久99精品成人片试看 | 久久久久国产一区二区| 久久99国产精品成人欧美| 一级做a爰片久久毛片毛片| 亚洲狠狠婷婷综合久久蜜芽| 久久久久久无码Av成人影院| 久久综合狠狠色综合伊人| 老司机午夜网站国内精品久久久久久久久| 色欲综合久久躁天天躁| 7777久久久国产精品消防器材| 久久棈精品久久久久久噜噜| 精品精品国产自在久久高清| 精品水蜜桃久久久久久久| 少妇久久久久久被弄到高潮| 一本色道久久HEZYO无码| 国产精品福利一区二区久久| 精品人妻伦九区久久AAA片69| 久久精品国产2020| 色综合久久中文综合网| 偷窥少妇久久久久久久久| 久久精品国产91久久综合麻豆自制 | 国内精品久久久久久久亚洲| 久久精品国产精品亚洲精品 | 精品多毛少妇人妻AV免费久久| 国内精品久久久人妻中文字幕|