C#调用Windows API函数截图
界面如下:

下面放了一个PictureBox
首先是声明函数:
//这里是调用 Windows API函数来进行截图
//首先导入库文件
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] //声明函数
private static extern IntPtr CreateDC
(
string Driver, //驱动名称
string Device, //设备名称
string Output, //无用,可以设定为null
IntPtr PrintData //任意的打印机数据
); [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int XDest, //目标对象的左上角X坐标
int YDest, //目标对象的左上角的Y坐标
int Width, //目标对象的宽度
int Height, //目标对象的高度
IntPtr hdcScr, //源设备的句柄
int XScr, //源设备的左上角X坐标
int YScr, //源设备的左上角Y坐标
Int32 drRop //光栅的操作值 );
截图按钮事件代码:
private void button1_Click(object sender, EventArgs e)
{
//创建显示器的DC
IntPtr dcScreen = CreateDC("DISPLAY", null, null, (IntPtr)null); //由一个指定设备的句柄创建一个新的Graphics对象
Graphics g1 = Graphics.FromHdc(dcScreen);
int tmpWidth, tmpHeigth; //获得保存图片的质量
long level = long.Parse(this.textBox5.Text); //如果是全屏捕获
if(this.radioButton1.Checked == true)
{
tmpWidth = Screen.PrimaryScreen.Bounds.Width;
tmpHeigth = Screen.PrimaryScreen.Bounds.Height;
Image MyImage = new Bitmap(tmpWidth, tmpHeigth, g1); //创建位图图形对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得窗体的上下文设备
IntPtr dc1 = g1.GetHdc();
//获得位图文件的上下文设备
IntPtr dc2 = g2.GetHdc(); //写入到位图
BitBlt(dc2, , , tmpWidth, tmpHeigth, dc1, , , ); //释放窗体的上下文设备
g1.ReleaseHdc(dc1);
//释放位图的上下文设备
g2.ReleaseHdc(dc2); //保存图像并显示
SaveImageWithQuality(MyImage,level);
this.pictureBox1.Image = MyImage; }
else
{
int X = Convert.ToInt32(this.textBox1.Text);
int Y = Convert.ToInt32(this.textBox2.Text);
int Width = Convert.ToInt32(this.textBox3.Text);
int Height = Convert.ToInt32(this.textBox4.Text); Image Myimage = new Bitmap(Width, Height,g1);
Graphics g2 = Graphics.FromImage(Myimage);
IntPtr dc1 = g1.GetHdc();
IntPtr dc2 = g2.GetHdc(); BitBlt(dc2,,,Width,Height,dc1,X,Y,);
g1.ReleaseHdc(dc1);
g2.ReleaseHdc(dc2); SaveImageWithQuality(Myimage, level);
this.pictureBox1.Image = Myimage; }
}
设置图片质量的函数,详细介绍:http://www.cnblogs.com/zhaotianff/p/5570321.html
//保存图片时设置质量
private void SaveImageWithQuality(Image bmp,long level)
{ ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters();
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, level);
myEncoderParameters.Param[] = myEncoderParameter;
bmp.Save(@"test.jpg", jgpEncoder, myEncoderParameters); } private ImageCodecInfo GetEncoder(ImageFormat format)
{ ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
运行效果:

可惜把自己也截出来了,正在寻找方法不把自己截出来,哈哈。
C#调用Windows API函数截图的更多相关文章
- VBS调用Windows API函数
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...
- Python调用Windows API函数编写录音机和音乐播放器
功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: 运行界面:
- MFC中调用Windows API函数的方式
windows aoi 函数的调用前面加::
- VBS调用windows api函数(postmessage)实现后台发送按键脚本
'=========================================================================='' VBScript Source File - ...
- c#让窗体永在最前 调用windows api 将窗体设为topmost
有时候应用程序需要将一个窗体始终位于屏幕的最前面,即使切换到其它窗体也能看到该窗体,这样的窗体就叫做TopMost窗体. 用C#制作TopMost窗体之前,首先要了解如何声明SetWindowPos函 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
- C#调用windows api示例
这是运行结果: Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提 供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩 展,一般也都提供 ...
- C#中调用Windows API的要点 .
介绍 API(Application Programming Interface),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能否认 ...
随机推荐
- 拿到阿里,网易游戏,腾讯,smartx的offer的过程
前言 从今年的3月14日阿里的电话面试开始,到现在4月16日在西安悦豪酒店进行的腾讯HR面到现在一个多月了,中间先后收到了阿里,网易游戏,腾讯和smartx的offer,今天早晨刚刚接到了腾讯HR的电 ...
- dev gridcontrol纵向合并单元格设置
1.要设置gridcontrol中指定列(columns中选中指定列)的AllowMerge属性为true; 2.要设置gridview中AllowCellMerge的属性为true; 3.如果只合并 ...
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
题目:http://codeforces.com/problemset/problem/519/E 题意:给你一个n个点的树,有m个询问(x,y),对于每个询问回答树上有多少个点和x,y点的距离相等 ...
- BGP路由协议详解(完整篇)
原文链接:http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文,曾许诺过要完善这个文档,但 ...
- DeviceFamily XAML Views(一)
DeviceFamily Veiws 可以为特定的设备(Mobile.Desktop等)制作特定的XAML视图,这种方式可以完全定制XMAL和共享后台代码. 以 Mobile 和 Desktop 为例 ...
- mysql中IFIND_IN_SET和like的区别
在数据库中新建一张测试表t_user,包含三个字段'id','name','grilfriend',字段很容易看出,这是记录一个人的女朋友的表,注意这里的‘firlfriend’字段可以是多个人名,之 ...
- [转]Java中怎样判断一个字符串能否转成数字
原文地址:http://blog.sina.com.cn/s/blog_7bac470701014mjf.html 判断字符串是否为数字 //1.正则表达式 public static boolea ...
- 使用SFTP工具下载文件
1. 打开SFTP会话 File->Connect SFTP Session 2. cd 到文件目录下 3. get 文件名称 sftp> get catalina.out 4. lpw ...
- nginx的安装
1,,nginx的安装 为什么使用nginx我就不多说了,很优秀的,请再行google 在安装前,先安装pcre,安装zlib,安装openssl,以及一些其他包 yum install -y gcc ...
- bootstrap 2.3版与3.0版的使用区别
bootstrap 2.3版与3.0版的使用区别 bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3.0版的区别在哪里呢?下面我们就来介 ...