日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

[转]c#调用API截图

發布時間:2024/1/17 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]c#调用API截图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自http://blog.csdn.net/hailiannanhai/article/details/6281471

要想完成這個功能,首先要了解一下在C#中如何調用API(應用程序接口)函數。雖然在.Net框架中已經提供了許多類庫,這些類庫的功能也十分強大,但對于一些Windows底層編程來說,還是要通過調用這些API函數才可以實現。所有API都在"Kernel"、"User "和"GDI"三個庫中得以運行:其中"Kernel",他的庫名為 "KERNEL32.DLL", 他主要用于產生與操作系統之間的關聯,譬如:程序加載,上下文選擇,文件輸入輸出,內存管理等等。"User "這個類庫在Win32中名叫 "USER32.DLL"。 它允許管理全部的用戶接口。譬如:窗口 、菜單 、對話框 、圖標等等。"GDI"(圖象設備接口),它在Win32中的庫名為:"GDI32.dll",它是圖形輸出庫。使用GDI Windows"畫"出窗口、菜單以及對話框等;它能創建圖形輸出;它也能保存圖形文件。由于本文所涉及到是圖象問題,所有調用的類庫是"GDI32.dll"。在本文程序中我們使用的API函數是"BitBlt",這個函數對于廣大程序員來說,一定不感覺到陌生,因為在圖象處理方面他的用途是相對廣的,在用其他程序語言編程中,時常也要和他打交道。在.Net FrameWork SDK中有一個名字空間"System.Runtime.InteropServices",此名字空間提供了一系列的類來訪問COM對象,和調用本地的 API函數。下面是在C#中聲明此函數:

[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ] private static extern bool BitBlt ( IntPtr hdcDest , // 目標 DC的句柄 int nXDest , int nYDest , int nWidth , int nHeight , IntPtr hdcSrc , // 源DC的句柄 int nXSrc , int nYSrc , System.Int32 dwRop // 光柵的處理數值 ) ;

?



通過上面這個聲明,就可以在下面的代碼中使用此函數了。

下面是用C#做屏幕捕獲程序的具體實現步驟:

(1).首先要獲得當前屏幕的graphic對象,通過以下代碼可以實現:

Graphics g1 = this.CreateGraphics ( ) ;

?



(2).創建一個Bitmap對象,并且這個Bitmap對象的大小是當前屏幕:

首先要獲得當前屏幕的大小,通過名字空間"System.Windows.Forms"中的"Screen"類的GetWorkingArea()方法,可以實現。下面是得到當前屏幕的長(Height)和寬(Width):

Rectangle rect = new Rectangle ( ) ; rect = Screen.GetWorkingArea ( this ) ; "屏幕寬"= rect.Width ; "屏幕長"= rect.Height ;

?



至此就可以得到我們想要的Bitmap了,通過下列語句可以實現:

Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ; //創建以屏幕大小為標準的位圖

?

在C#中,可以使用System.Windows.SystemParameters獲取有關屏幕真實狀態的基本信息。

  1. 獲取屏幕像素:    

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth

?

  2. 獲取工作區(不包括任務欄)像素:

SystemParameters.WorkArea.HeightSystemParameters.WorkArea.Width

?

?

C# 獲得屏幕大小?

Rectangle rect=System.Windows.Forms.SystemInformation.VirtualScreen; int width=rect.Width; int height=rect.Height;

?




(3).獲得當前屏幕和此Bitmap對象的DC,這可以通過下列語句實現:

//得到屏幕的DC IntPtr dc1 = g1.GetHdc ( ) ; //得到Bitmap的DC IntPtr dc2 = g2.GetHdc ( ) ;

?





(4).調用API函數,把當前屏幕拷貝到創建的Bitmap中:

BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;

?




(5).釋放當前屏幕和此Bitmap對象的DC,通過下面代碼可以實現:

//釋放掉屏幕的DC g1.ReleaseHdc ( dc1 ) ; //釋放掉Bitmap的DC g2.ReleaseHdc ( dc2 ) ;

?



(6).保存Bitmap對象,形成jpg圖片:

MyImage.Save ( @"c:Capture.jpg" , ImageFormat.Jpeg );

?




當然你也可以根據自己的需要,把屏幕以其他圖片的格式來保存,如果你想把圖片保存為位圖文件,可以把"ImageFormat.Jpeg"改換成"ImageFormat.Bmp";想把圖片保存為Gif文件,就把"ImageFormat.Jpeg"改換成"ImageFormat.Gif"。你可以保存的文件類型大概有十多種,這里就不一一介紹了,當然你也要相應改變保存文件的后綴。

用C#來捕獲屏幕的源程序代碼(Capture.cs):

了解上面的這些步驟的實現方法,就可以得到用C#捕獲屏幕的源程序,如下:

using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; using System.Drawing.Imaging ; public class Form1 : Form. { private Button button1 ; private System.ComponentModel.Container components = null ;public Form1 ( ) { //初始化窗體中的各個組件 InitializeComponent ( ) ; } // 清除程序中使用過的資源 protected override void Dispose ( bool disposing ) { if ( disposing ) { if ( components != null ) { components.Dispose ( ) ; } } base.Dispose ( disposing ) ; } private void InitializeComponent ( ) { button1 = new Button ( ); SuspendLayout ( ) ; button1.Location = new System.Drawing.Point ( 64 , 40 ) ; button1.Name = "button1" ; button1.Size = new System.Drawing.Size ( 80 , 32 ) ; button1.TabIndex = 0 ; button1.Text = "捕獲" ; button1.Click += new System.EventHandler ( button1_Click ) ;AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; ClientSize = new System.Drawing.Size ( 216 , 125 ) ; Controls.Add ( button1 ) ; MaximizeBox = false ; MinimizeBox = false ; Name = "Form1" ; Text = "C#捕獲當前屏幕!" ; ResumeLayout ( false ) ;} //聲明一個API函數 [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ] private static extern bool BitBlt ( IntPtr hdcDest , // 目標 DC的句柄 int nXDest , int nYDest , int nWidth , int nHeight , IntPtr hdcSrc , // 源DC的句柄 int nXSrc , int nYSrc , System.Int32 dwRop // 光柵的處理數值 ) ;static void Main ( ) { Application.Run ( new Form1 ( ) ) ; } private void button1_Click ( object sender , System.EventArgs e ) { //獲得當前屏幕的大小 Rectangle rect = new Rectangle ( ) ; rect = Screen.GetWorkingArea ( this ) ; //創建一個以當前屏幕為模板的圖象 Graphics g1 = this.CreateGraphics ( ) ; //創建以屏幕大小為標準的位圖 Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ; Graphics g2 = Graphics.FromImage ( MyImage ) ; //得到屏幕的DC IntPtr dc1 = g1.GetHdc ( ) ; //得到Bitmap的DC IntPtr dc2 = g2.GetHdc ( ) ; //調用此API函數,實現屏幕捕獲 BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ; //釋放掉屏幕的DC g1.ReleaseHdc ( dc1 ) ; //釋放掉Bitmap的DC g2.ReleaseHdc ( dc2 ) ; //以JPG文件格式來保存 MyImage.Save ( @"c:Capture.jpg" , ImageFormat.Jpeg ); MessageBox.Show ( "當前屏幕已經保存為C盤的capture.jpg文件!" ) ; } }

?

轉載于:https://www.cnblogs.com/code1992/p/6136001.html

總結

以上是生活随笔為你收集整理的[转]c#调用API截图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。