C#區域截圖——調用API截圖

前言:截圖對於一個C++開發者來講無非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法屏幕操做,做爲一名成天想着用 C++ 開發遊戲的初級 C#.NET 的程序員的我,只是本身研究區域截圖,失敗 n 屢次,最後在半夢半醒中弄出來的簡單的Demo,簡單的分享一下而已。如此的班門弄斧,着實不堪,另外個人 C++ 水平也是處於入門水準,若是該博客有什麼問題,請各位朋友留言指正,謝謝關照!程序員


附件及其餘:windows

C#的 Graphics.CopyFromScreen 方法   https://msdn.microsoft.com/zh-cn/library/fw1kt6f9.aspx框架

附件:http://files.cnblogs.com/files/herbertchina/GetFormDemo.zip函數


本文Demo:(VS2010環境)學習

本文使用的圖片素材:google

image


本文主題:spa

從窗體的圖片中截取須要的部分,本例是驗證碼區域。code


正文:orm

先貼出主要代碼blog

        /// <summary>
        /// 指定窗口區域截圖
         /// </summary>
        /// <param name="handle">窗口句柄. (在windows應用程序中, 從Handle屬性得到)</param>
        /// <param name="rect">窗口中的一個區域</param>
        /// <returns></returns>
        public  Bitmap CaptureWindow(IntPtr hWnd,RECT rect)
        {
            // 獲取設備上下文環境句柄
              IntPtr hscrdc = GetWindowDC(hWnd);

            // 建立一個與指定設備兼容的內存設備上下文環境(DC)
              IntPtr hmemdc = CreateCompatibleDC(hscrdc);
            IntPtr myMemdc = CreateCompatibleDC(hscrdc);

            // 返回指定窗體的矩形尺寸
              RECT rect1;
            GetWindowRect(hWnd, out rect1);

            // 返回指定設備環境句柄對應的位圖區域句柄
              IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, rect1.Right - rect1.Left, rect1.Bottom - rect1.Top);
            IntPtr myBitmap = CreateCompatibleBitmap(hscrdc, rect.Right - rect.Left, rect.Bottom - rect.Top);

            //把位圖選進內存DC 
            // IntPtr OldBitmap = (IntPtr)SelectObject(hmemdc, hbitmap);
            SelectObject(hmemdc, hbitmap);
            SelectObject(myMemdc, myBitmap);

            /////////////////////////////////////////////////////////////////////////////
            //
            // 下面開始所謂的做畫過程,此過程能夠用的方法不少,看你怎麼調用 API 了
              //
            /////////////////////////////////////////////////////////////////////////////

            // 直接打印窗體到畫布
              PrintWindow(hWnd, hmemdc, 0);

            // IntPtr hw = GetDesktopWindow();
            // IntPtr hmemdcClone = GetWindowDC(myBitmap);

            BitBlt(myMemdc, 0, 0, rect.Right - rect.Left, rect.Bottom - rect.Top, hmemdc, rect.Left, rect.Top, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
            //SelectObject(myMemdc, myBitmap);

            Bitmap bmp = Bitmap.FromHbitmap(myBitmap);
            DeleteDC(hscrdc);
            DeleteDC(hmemdc);
            DeleteDC(myMemdc);
            return bmp;
        }

講解吧:

原理步驟:
一、經過窗體 handle 建立設備上下文環境
二、根據上下文環境句柄創建對應的與設備兼容的內存設備上下文環境(理解成一塊畫板,內存上的)
三、經過窗體句柄獲得長寬,經過CreateCompatibleBitmap獲得窗體對應的設備環境句柄對應的位圖區域(理解成天然界的一個美麗的景色)
四、經過 SelectObject 指向性,把 3 中的位圖區域句柄對應到 2 中的內存設備上下文中(理解成,我須要畫這大天然的美麗景色,我須要有相應的畫布,這裏就是在畫板上固定畫布)
五、繪圖,包括各類 API 繪圖或獲取圖形
六、此處很重要,由於咱們不是要過去框架的總體圖形,咱們要的是局部的,因而,咱們能夠經過 1 、2 、3 、4 的步驟,再建設一塊畫布(第三步有一點區別,就是長寬)
七、經過 BitBlt 方法把以前畫好的畫的一個區域複製到咱們新建的畫板上, BitBlt 的功能是「對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境」
八、而後就簡單了,Bitmap bmp = Bitmap.FromHbitmap(myBitmap);把咱們複製出來的第二塊畫板上的畫生成位圖圖像
九、再進行什麼操做就隨你了
十、最後,最後,最最重要的是……不要忘了使用 DeleteDC 函數清除第 1 、 2 中建的上下文環境,由於這是 API,沒有Java的自動清理機制


再者:

再者,哥們我是初學者,文章僅供參考,有什麼問題能夠百度、google,而後就是,我上面說的必定有問題,請看明白的朋友指正留言,幫助下小友學習一二!謝謝!

相關文章
相關標籤/搜索