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#有了强大的类库,但是,我们还是不能否认 ...
随机推荐
- bash中变量+=,if大小判断,随机休眠
#!/bin/bash index= while true;do echo "hello" (( index+=)) echo `date "+%H:%M:%S" ...
- [BZOJ 2819]NIM(dfs序维护树上xor值)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...
- 根本没有“JSON“对象这回事(读汤姆大叔博文记录)
1.字面量 (1)他们是固定的值,不是变量,让你从“字面上”理解脚本. (2)字符串字面量是由双引号("")或单引号('')包围起来的零个或多个字符串组成的. (3)对象字面量是由 ...
- WEB 文件上传
关键:<input name="file" type="file"/> 然后,在外面<form>层中必须写上:enctype=" ...
- 在eclipse下如何安装下载好的插件
我们下载到的插件,如果是一个jar格式的包,那么我们所需要做的事,就是 第一,新建一个名为plugins的文件夹, 第二,新建一个名为eclipse的文件夹,再将plugins复制进eclipse中, ...
- Rootkit Hunter恶意程序查杀
恶意程序,恶意代码检测 下载:https://pkgs.org/search/rkhunter 安装:rpm -ivh rkunter* Installed: #需要先安装 lsof.x86_64 ...
- Linux配置无线网卡驱动实现无线上网
本机装Linux,需要配置的无线驱动.一般Ubuntu都集成无线驱动,基本上无线可以直接使用! 01.查看无线网卡的型号 [root@Mr-zhao software]# lspci | gre ...
- hwclock 显示或设置CMOS时间
显示或设置CMOS时间 hwclock [options] 选项 -r 默认选项,读取并打印CMOS时间 -s 将CMOS时间设置为系统时间 - ...
- 2-ls 显示目录内容
ls list directory contents 显示目录内容 [语法]: ls [选项] [参数] [功能介绍] ls指令用来显示目录列表,在Linux系统中有着较高的使用率.ls指令的输出信息 ...
- 给菜单加个优雅的unselect事件
先上图,说场景 假设默认选中的是item1,我现在选中item3了,有时候需要对item1做一些别的处理.常见的做法是,切换选中状态前找到当前选中(item1),或者每次选中后选中的项记录在中间变量. ...