解決C# 截取當(dāng)前程序窗口指定位置截圖的實(shí)現(xiàn)方法
更新時(shí)間:2013年05月20日 11:07:16 作者:
本篇文章是對(duì)C#中截取當(dāng)前程序窗口指定位置截圖的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
要想完成這個(gè)功用,首先要了解一下在C#中如何調(diào)用API(利用程序交口)函數(shù)。固然在.Net框架中已經(jīng)降求了很多類庫(kù),400電話,這些類庫(kù)的功效也非常強(qiáng)盛,但關(guān)于一些Windows頂層編程來(lái)道,仍是要通過(guò)調(diào)用這些API函數(shù)才可以實(shí)現(xiàn)。一切API皆在"Kernel"、"User "和"GDI"三個(gè)庫(kù)中得以運(yùn)轉(zhuǎn):其中"Kernel",他的庫(kù)名為 "KERNEL32.DLL", 他重要用于發(fā)生取操做體系之間的聯(lián)系關(guān)系,譬如:程序加載,上下文挑選,文件輸進(jìn)輸出,內(nèi)存治理等等。"User "這個(gè)類庫(kù)在Win32中名鳴 "USER32.DLL"。 它容許治理全體的用戶交心。譬如:窗心 、菜雙 、對(duì)話框 、圖本等等。"GDI"(圖象裝備交口),它正在Win32中的庫(kù)實(shí)為:"GDI32.dll",它是圖形輸出庫(kù)。使用GDI Windows"繪"出窗心、菜雙以及對(duì)話框等;它能創(chuàng)修圖形輸出;它也能保存圖形文件。因?yàn)樵乃|及到是圖象答題,一切調(diào)用的類庫(kù)是"GDI32.dll"。在原文程序中人們使用的API函數(shù)是"BitBlt",這個(gè)函數(shù)關(guān)于寬大程序員來(lái)道,必定沒(méi)有感覺(jué)到生疏,由于在圖象處置方面他的用處是絕對(duì)狹的,在用其他程序言語(yǔ)編程中,經(jīng)常也要和他挨接講。在.Net FrameWork SDK中有一個(gè)實(shí)字空間"System.Runtime.InteropServices",此名字空間降求了一系列的類來(lái)拜訪COM對(duì)象,和調(diào)用外地的API函數(shù)。下面是正在C#中聲亮此函數(shù):
[ 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 // 光柵的處置數(shù)值
) ;
通過(guò)上面這個(gè)聲亮,就可以正在下里的代碼中使用此函數(shù)了。
下里是用C#做屏幕捕捉程序的詳細(xì)真隱步驟:
(1).首先要取得當(dāng)前屏幕的graphic對(duì)象,通過(guò)以下代碼可以真隱:
Graphics g1 = this.CreateGraphics ( ) ;
(2).創(chuàng)修一個(gè)Bitmap對(duì)象,十月媽咪,并且那個(gè)Bitmap對(duì)象的大小是當(dāng)前屏幕:
首先要獲得當(dāng)前屏幕的大小,通過(guò)實(shí)字空間"System.Windows.Forms"中的"Screen"類的GetWorkingArea()方式,可以實(shí)現(xiàn)。下面是得到當(dāng)前屏幕的長(zhǎng)(Height)和闊(Width):
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea ( this ) ;
"屏幕闊"= rect.Width ;
"屏幕長(zhǎng)"= rect.Height ;
至彼便能夠失掉人們念要的Bitmap了,通功下列語(yǔ)句可以完成:
Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
//創(chuàng)修以屏幕大小為尺度的位圖
(3).取得當(dāng)前屏幕和此Bitmap對(duì)于象的DC,那可以通功下列語(yǔ)句真隱:
//失掉屏幕的DC
IntPtr dc1 = g1.GetHdc ( ) ;
//失掉Bitmap的DC
IntPtr dc2 = g2.GetHdc ( ) ;
(4).調(diào)用API函數(shù),把以后屏幕拷貝到創(chuàng)立的Bitmap中:
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
(5).開(kāi)釋該前屏幕和彼Bitmap對(duì)于象的DC,通功下里代碼能夠完成:
//開(kāi)釋掉屏幕的DC
g1.ReleaseHdc ( dc1 ) ;
//開(kāi)釋掉Bitmap的DC
g2.ReleaseHdc ( dc2 ) ;
(6).保管Bitmap對(duì)于象,構(gòu)成jpg圖片:
MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
該然你也可以依據(jù)本人的須要,把屏幕以其他圖片的格局來(lái)保管,假如您念把圖片保存為位圖文件,可以把"ImageFormat.Jpeg"更換成"ImageFormat.Bmp";念把圖片保管為Gif白件,便把"ImageFormat.Jpeg"更換成"ImageFormat.Gif"。您能夠保存的文件類型大約有十少類,那里便沒(méi)有逐個(gè)引見(jiàn)了,當(dāng)然您也要相當(dāng)轉(zhuǎn)變保留文件的后綴。
用C#來(lái)捕捉屏幕的流程序代碼(Capture.cs):
了解上面的這些步驟的實(shí)現(xiàn)方式,就可以得到用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 ( )
{
//始初化窗體中的各個(gè)組件
InitializeComponent ( ) ;
}
// 肅清程序中使用過(guò)的資源
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 ) ;
}
//聲亮一個(gè)API函數(shù)
[ 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 // 光柵的處置數(shù)值
) ;
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , System.EventArgs e )
{
//取得當(dāng)前屏幕的大小
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea ( this ) ;
//創(chuàng)立一個(gè)以以后屏幕為模板的圖象
Graphics g1 = this.CreateGraphics ( ) ;
//創(chuàng)立以屏幕大小為尺度的位圖
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 ( ) ;
//調(diào)用彼API函數(shù),完成屏幕捕捉
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
//開(kāi)釋掉屏幕的DC
g1.ReleaseHdc ( dc1 ) ;
//開(kāi)釋掉Bitmap的DC
g2.ReleaseHdc ( dc2 ) ;
//以JPG白件格局來(lái)保留
MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
MessageBox.Show ( "該前屏幕已經(jīng)保留為C盤的capture.jpg白件!" ) ;
}
}
復(fù)制代碼 代碼如下:
[ 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 // 光柵的處置數(shù)值
) ;
通過(guò)上面這個(gè)聲亮,就可以正在下里的代碼中使用此函數(shù)了。
下里是用C#做屏幕捕捉程序的詳細(xì)真隱步驟:
(1).首先要取得當(dāng)前屏幕的graphic對(duì)象,通過(guò)以下代碼可以真隱:
Graphics g1 = this.CreateGraphics ( ) ;
(2).創(chuàng)修一個(gè)Bitmap對(duì)象,十月媽咪,并且那個(gè)Bitmap對(duì)象的大小是當(dāng)前屏幕:
首先要獲得當(dāng)前屏幕的大小,通過(guò)實(shí)字空間"System.Windows.Forms"中的"Screen"類的GetWorkingArea()方式,可以實(shí)現(xiàn)。下面是得到當(dāng)前屏幕的長(zhǎng)(Height)和闊(Width):
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea ( this ) ;
"屏幕闊"= rect.Width ;
"屏幕長(zhǎng)"= rect.Height ;
至彼便能夠失掉人們念要的Bitmap了,通功下列語(yǔ)句可以完成:
Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
//創(chuàng)修以屏幕大小為尺度的位圖
(3).取得當(dāng)前屏幕和此Bitmap對(duì)于象的DC,那可以通功下列語(yǔ)句真隱:
//失掉屏幕的DC
IntPtr dc1 = g1.GetHdc ( ) ;
//失掉Bitmap的DC
IntPtr dc2 = g2.GetHdc ( ) ;
(4).調(diào)用API函數(shù),把以后屏幕拷貝到創(chuàng)立的Bitmap中:
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
(5).開(kāi)釋該前屏幕和彼Bitmap對(duì)于象的DC,通功下里代碼能夠完成:
//開(kāi)釋掉屏幕的DC
g1.ReleaseHdc ( dc1 ) ;
//開(kāi)釋掉Bitmap的DC
g2.ReleaseHdc ( dc2 ) ;
(6).保管Bitmap對(duì)于象,構(gòu)成jpg圖片:
MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
該然你也可以依據(jù)本人的須要,把屏幕以其他圖片的格局來(lái)保管,假如您念把圖片保存為位圖文件,可以把"ImageFormat.Jpeg"更換成"ImageFormat.Bmp";念把圖片保管為Gif白件,便把"ImageFormat.Jpeg"更換成"ImageFormat.Gif"。您能夠保存的文件類型大約有十少類,那里便沒(méi)有逐個(gè)引見(jiàn)了,當(dāng)然您也要相當(dāng)轉(zhuǎn)變保留文件的后綴。
用C#來(lái)捕捉屏幕的流程序代碼(Capture.cs):
了解上面的這些步驟的實(shí)現(xiàn)方式,就可以得到用C#捕捉屏幕的流程序,如下:
復(fù)制代碼 代碼如下:
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 ( )
{
//始初化窗體中的各個(gè)組件
InitializeComponent ( ) ;
}
// 肅清程序中使用過(guò)的資源
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 ) ;
}
//聲亮一個(gè)API函數(shù)
[ 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 // 光柵的處置數(shù)值
) ;
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , System.EventArgs e )
{
//取得當(dāng)前屏幕的大小
Rectangle rect = new Rectangle ( ) ;
rect = Screen.GetWorkingArea ( this ) ;
//創(chuàng)立一個(gè)以以后屏幕為模板的圖象
Graphics g1 = this.CreateGraphics ( ) ;
//創(chuàng)立以屏幕大小為尺度的位圖
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 ( ) ;
//調(diào)用彼API函數(shù),完成屏幕捕捉
BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
//開(kāi)釋掉屏幕的DC
g1.ReleaseHdc ( dc1 ) ;
//開(kāi)釋掉Bitmap的DC
g2.ReleaseHdc ( dc2 ) ;
//以JPG白件格局來(lái)保留
MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
MessageBox.Show ( "該前屏幕已經(jīng)保留為C盤的capture.jpg白件!" ) ;
}
}
相關(guān)文章
C#實(shí)現(xiàn)的文件上傳下載工具類完整實(shí)例【上傳文件自動(dòng)命名】
這篇文章主要介紹了C#實(shí)現(xiàn)的文件上傳下載工具類,結(jié)合完整實(shí)例形式分析了C#操作文件上傳與下載功能,并且還可針對(duì)上傳文件自動(dòng)命名以避免服務(wù)器中的文件名重復(fù),需要的朋友可以參考下2017-11-11WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤方法實(shí)例詳解
這篇文章主要介紹了WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤方法,實(shí)例分析了C#中實(shí)現(xiàn)WinForm最小化到系統(tǒng)托盤所需的相關(guān)控件與使用技巧,需要的朋友可以參考下2015-05-05C#根據(jù)年月日計(jì)算星期幾的函數(shù)小例子
這篇文章介紹了C#根據(jù)年月日計(jì)算星期幾的函數(shù)小例子,有需要的朋友可以參考一下2013-07-07C#實(shí)現(xiàn)DevExpress本地化實(shí)例詳解
這篇文章主要介紹了C#實(shí)現(xiàn)DevExpress本地化,以實(shí)例形式較為詳細(xì)的分析了DevExpress本地化的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08基于C#實(shí)現(xiàn)一個(gè)溫濕度監(jiān)測(cè)小工具
這篇文章主要為大家詳細(xì)介紹了如何基于C#實(shí)現(xiàn)一個(gè)溫濕度監(jiān)測(cè)小工具,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-01-01C#中將DataTable轉(zhuǎn)化成List<T>的方法解析
大家應(yīng)該都知道在.net項(xiàng)目中使用到DataTable和List<T>集合的地方較多,有的時(shí)候需要將DataTable轉(zhuǎn)化成List<T>,那么改如何轉(zhuǎn)化呢?下面通過(guò)這篇文章來(lái)一起學(xué)習(xí)下吧,本文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值。2016-12-12VisualStudio2019安裝C#環(huán)境的實(shí)現(xiàn)方法
這篇文章主要介紹了VisualStudio2019安裝C#環(huán)境的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12