C#调用Windows API函数截图

摘要:
界面如下:下面放置一个PictureBox。首先,声明函数:1//这里,调用WindowsAPI函数进行截图。2//首先,导入库文件3[System.Runtime.InteropServices.DllImportAttribute(“gdi32.dll”)]45//声明函数6privatestaticxternIntPtrCreateDC7(8stringDriver,//驱动程序名称9stringDriver

界面如下:

C#调用Windows API函数截图第1张

下面放了一个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         }

运行效果:

C#调用Windows API函数截图第2张

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

免责声明:文章转载自《C#调用Windows API函数截图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 内存查看工具Windows Installer (MSI) 详解 参数介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

手写Redux-Saga源码

上一篇文章我们分析了Redux-Thunk的源码,可以看到他的代码非常简单,只是让dispatch可以处理函数类型的action,其作者也承认对于复杂场景,Redux-Thunk并不适用,还推荐了Redux-Saga来处理复杂副作用。本文要讲的就是Redux-Saga,这个也是我在实际工作中使用最多的Redux异步解决方案。Redux-Saga比Redux...

openGL 函数 收集

glViewport()函数 在OpenGL初始化完成之后,我们应该进行一些视图设置。首先是设定视见区域,即告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。我们调用glViewPort函数来决定视见区域: procedureglViewPort(x:GLInt;y:GLInt;Widt...

使用异步I/O大大提高应用程序的性能

转自:https://www.ibm.com/developerworks/cn/linux/l-async/ AIO简介 Linux中最常见的输入输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待I/O请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情...

Linux 异步IO(AIO)

目录 1.select和poll 2. BSD异步IO 3. POSIX异步IO(AIO) 3.1 AIO控制块 3.2 aio_read & aio_write 3.3 aio_fsync 3.4 aio_error 3.5 aio_return 3.6 aio_suspend 3.7 aio_cancel 3.8 lio_listio...

安卓Camera APP

一、Camera          package android.hardware            该类用于设定图像捕获设置,开启/关闭预览,抓拍图片以及获取帧用于编码视频。这个类是Camera服务的客户端,用于管理真实的照相机硬件。          为了能够访问照相机,你必须在你的Android Manifest内声明CAMERA权限。同时确保...

Ogre 渲染队列(二)

转自:http://www.cnblogs.com/cppguru/archive/2009/11/25/1610626.html 简要说Ogre渲染主流程分三步使用渲染队列:清空、构造和访问,这个过程在每一帧的绘制过程中重复执行。 渲染队列的清空 Ogre在每一帧渲染前都会先清空渲染队列。熟悉Ogre渲染流程的很容易看到在SceneManager::_r...