花絮
上火了,眼睛疼ing...滴了眼药...看你还敢疼的!
上火了,眼睛疼ing...滴了眼药...看你还敢疼的!
这两天一直在攻克抓屏这一关.手头有几本书,还有网上的一些例子,都是使用Win32 API的BitBlt函数.大同小异.今天在看.NET Framework 2.0的类库时,偶然发现原来抓屏功能已经集成进.NET Framework 2.0的Graphics类了,是个实例方法.两行代码就搞定!下面我给出代码.排在后面的是使用Win32实现的代码,不过已经用处不大了:p
1.使用.NET Framework 2.0 类库新功能:
//==========
水之真谛
==========//
//
// =http://blog.csdn.net/FantasiaX //
//
//====== 上善若水,润物无声 ====//
using System;
using System.Text;
// 以下3个 using 是手动添加的,要想使用 System.Drawing ,还要添加 System.Drawing.dll 的引用
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
namespace SuperCamera
{
class Program
{
static void Main(string[] args)
{
// 给你5秒钟,摆个 Pose!
Thread.Sleep(5000);
// 说:茄 ~~~~~ 子 ~~~~~~
Bitmap photo = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);
Graphics graph = Graphics.FromImage(photo);
graph.CopyFromScreen(0, 0, 0, 0, new Size(1024, 768));
photo.Save(@"C:\ 水之真谛 .jpg" , ImageFormat.Jpeg);
Console.WriteLine(@"OK, 去 C:\ 盘下面取照片吧!不过,唔 ~~~ 不是你的哦! " );
Console.ReadLine();
}
}
}
//
// =http://blog.csdn.net/FantasiaX //
//
//====== 上善若水,润物无声 ====//
using System;
using System.Text;
// 以下3个 using 是手动添加的,要想使用 System.Drawing ,还要添加 System.Drawing.dll 的引用
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
namespace SuperCamera
{
class Program
{
static void Main(string[] args)
{
// 给你5秒钟,摆个 Pose!
Thread.Sleep(5000);
// 说:茄 ~~~~~ 子 ~~~~~~
Bitmap photo = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);
Graphics graph = Graphics.FromImage(photo);
graph.CopyFromScreen(0, 0, 0, 0, new Size(1024, 768));
photo.Save(@"C:\ 水之真谛 .jpg" , ImageFormat.Jpeg);
Console.WriteLine(@"OK, 去 C:\ 盘下面取照片吧!不过,唔 ~~~ 不是你的哦! " );
Console.ReadLine();
}
}
}
2.使用Win32 API的:
using System;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Threading;
namespace SimpleCamera
{
class Program
{
[DllImport("gdi32.dll")]
private static extern IntPtr CreateDC(string driver, string device, string win16, IntPtr printDev);
[DllImport("gdi32.dll")]
private static extern bool BitBlt(IntPtr outputDC, int left, int top, int width, int height, IntPtr sourceDC, int x, int y, int opt);
static void Main(string[] args)
{
Thread.Sleep(5000);
//获取与屏幕相关的DC,并基于此DC生成Graph。
IntPtr screenDC = CreateDC("DISPLAY", null, null, IntPtr.Zero);
Graphics screenGraph = Graphics.FromHdc(screenDC);
//以屏幕Ghraph为基础,生成位图
Image outputImage = new Bitmap(1024, 768, screenGraph);
//获取与位图关联的Graph,并基于此获得位图的DC。
Graphics imgGraph = Graphics.FromImage(outputImage);
IntPtr imgDC = imgGraph.GetHdc();
//使用Win32 API "灌图"
BitBlt(imgDC, 0, 0, 1024, 768, screenDC, 0, 0, 0xCC0020);
//保存位图
imgGraph.ReleaseHdc(imgDC);
outputImage.Save(@"C:\水之真谛.jpg", ImageFormat.Jpeg);
}
}
}
本文转自 水之真谛 51CTO博客,原文链接:http://blog.51cto.com/liutiemeng/18757,如需转载请自行联系原作者