C#調用Windows API函數截圖


界面如下:

下面放了一個PictureBox

 

首先是聲明函數:

 1 //這里是調用 Windows API函數來進行截圖
 2         //首先導入庫文件
 3         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
 4 
 5         //聲明函數
 6         private static extern IntPtr CreateDC
 7         (
 8             string Driver,   //驅動名稱
 9             string Device,   //設備名稱
10             string Output,   //無用,可以設定為null
11             IntPtr PrintData //任意的打印機數據
12          );
13 
14 
15         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
16         private static extern bool BitBlt(
17             IntPtr hdcDest,     //目標設備的句柄
18             int XDest,          //目標對象的左上角X坐標
19             int YDest,          //目標對象的左上角的Y坐標
20             int Width,          //目標對象的寬度
21             int Height,         //目標對象的高度
22             IntPtr hdcScr,      //源設備的句柄
23             int XScr,           //源設備的左上角X坐標
24             int YScr,           //源設備的左上角Y坐標
25             Int32 drRop         //光柵的操作值
26 
27             );

截圖按鈕事件代碼:

 1 private void button1_Click(object sender, EventArgs e)
 2         {
 3             //創建顯示器的DC
 4             IntPtr dcScreen = CreateDC("DISPLAY", null, null, (IntPtr)null);
 5 
 6             //由一個指定設備的句柄創建一個新的Graphics對象
 7             Graphics g1 = Graphics.FromHdc(dcScreen);
 8             int tmpWidth, tmpHeigth;
 9 
10 
11             //獲得保存圖片的質量
12             long level = long.Parse(this.textBox5.Text);
13 
14             //如果是全屏捕獲
15             if(this.radioButton1.Checked == true)
16             {
17                 tmpWidth = Screen.PrimaryScreen.Bounds.Width;
18                 tmpHeigth = Screen.PrimaryScreen.Bounds.Height;
19                 Image MyImage = new Bitmap(tmpWidth, tmpHeigth, g1);
20 
21                 //創建位圖圖形對象
22                 Graphics g2 = Graphics.FromImage(MyImage);
23                 //獲得窗體的上下文設備
24                 IntPtr dc1 = g1.GetHdc();
25                 //獲得位圖文件的上下文設備
26                 IntPtr dc2 = g2.GetHdc();
27 
28                 //寫入到位圖
29                 BitBlt(dc2, 0, 0, tmpWidth, tmpHeigth, dc1, 0, 0, 13369376);
30                 
31                 //釋放窗體的上下文設備
32                 g1.ReleaseHdc(dc1);
33                 //釋放位圖的上下文設備
34                 g2.ReleaseHdc(dc2);
35 
36 
37                 //保存圖像並顯示
38                 SaveImageWithQuality(MyImage,level);
39                 this.pictureBox1.Image = MyImage;
40 
41             }
42             else
43             {
44                 int X = Convert.ToInt32(this.textBox1.Text);
45                 int Y = Convert.ToInt32(this.textBox2.Text);
46                 int Width = Convert.ToInt32(this.textBox3.Text);
47                 int Height = Convert.ToInt32(this.textBox4.Text);
48 
49                 Image Myimage = new Bitmap(Width, Height,g1);
50                 Graphics g2 = Graphics.FromImage(Myimage);
51                 IntPtr dc1 = g1.GetHdc();
52                 IntPtr dc2 = g2.GetHdc();
53 
54                 BitBlt(dc2,0,0,Width,Height,dc1,X,Y,13369376);
55                 g1.ReleaseHdc(dc1);
56                 g2.ReleaseHdc(dc2);
57 
58                 SaveImageWithQuality(Myimage, level);
59                 this.pictureBox1.Image = Myimage;
60 
61 
62             }
63         }

設置圖片質量的函數,詳細介紹:http://www.cnblogs.com/zhaotianff/p/5570321.html

 1  //保存圖片時設置質量
 2         private void SaveImageWithQuality(Image bmp,long level)
 3         {
 4             
 5            
 6             ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
 7             System.Drawing.Imaging.Encoder myEncoder =
 8                 System.Drawing.Imaging.Encoder.Quality;
 9             EncoderParameters myEncoderParameters = new EncoderParameters(1);
10             EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, level);
11             myEncoderParameters.Param[0] = myEncoderParameter;
12             bmp.Save(@"test.jpg", jgpEncoder, myEncoderParameters);
13 
14             
15 
16         }
17 
18 
19 
20 
21 
22         private ImageCodecInfo GetEncoder(ImageFormat format)
23         {
24 
25             ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
26 
27             foreach (ImageCodecInfo codec in codecs)
28             {
29                 if (codec.FormatID == format.Guid)
30                 {
31                     return codec;
32                 }
33             }
34             return null;
35         }

運行效果:

可惜把自己也截出來了,正在尋找方法不把自己截出來,哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM