界面如下:

下面放了一個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 }
運行效果:

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