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

來源:互聯網
上載者:User

標籤:

前言:對於一個C++開發人員來說無非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法螢幕操作,作為一名整天想著用 C++ 開發遊戲的初級 C#.NET 的程式員的我,只是自己研究地區,失敗 n 多次,最後在半夢半醒中弄出來的簡單的Demo,簡單的分享一下而已。如此的班門弄斧,著實不堪,另外我的 C++ 水平也是處於入門水準,如果該部落格有什麼問題,請各位朋友留言指正,謝謝關照!

附件及其他:

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

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

本文Demo:(VS2010環境)

本文使用的圖片素材:

本文主題:

從表單的圖片中截取需要的部分,本例是驗證碼地區。

本文:

先貼出主要代碼

        /// <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;        }

講解吧:

原理步驟:
1、通過表單 handle 建立裝置上下文環境
2、根據上下文環境控制代碼建立對應的與裝置相容的記憶體裝置上下文環境(理解成一塊畫板,記憶體上的)
3、通過表單控制代碼得到長寬,通過CreateCompatibleBitmap得到表單對應的裝置環境控制代碼對應的位元影像地區(理解成自然界的一個美麗的景色)
4、通過 SelectObject 指向性,把 3 中的位元影像地區控制代碼對應到 2 中的記憶體裝置上下文中(理解成,我需要畫這大自然的美麗景色,我需要有相應的畫布,這裡就是在畫板上固定畫布)
5、繪圖,包括各種 API 繪圖或擷取圖形
6、此處很重要,因為我們不是要過去架構的整體圖形,我們要的是局部的,於是,我們可以通過 1 、2 、3 、4 的步驟,再建設一塊畫布(第三步有一點區別,就是長寬)
7、通過 BitBlt 方法把之前畫好的畫的一個地區複製到我們建立的畫板上, BitBlt 的功能是“對指定的源裝置環境地區中的像素進行位塊(bit_block)轉換,以傳送到目標裝置環境”
8、然後就簡單了,Bitmap bmp = Bitmap.FromHbitmap(myBitmap);把我們複製出來的第二塊畫板上的畫產生位元影像映像
9、再進行什麼操作就隨你了
10、最後,最後,最最重要的是……不要忘了使用 DeleteDC 函數清除第 1 、 2 中建的上下文環境,因為這是 API,沒有Java的自動清理機制

再者:

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

C#地區——調用API

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.