解決C# 截取當前程式視窗指定位置截圖的實現方法

來源:互聯網
上載者:User

要想完成這個功用,首先要瞭解一下在C#中如何調用API(利用程式交口)函數。固然在.Net架構中已經降求了很多類庫,400電話,這些類庫的功效也非常強盛,但關於一些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 ) ;
//創修以螢幕大小為尺度的位元影像
(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白件!" ) ;
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.