[翻译]C#基础演练:屏幕抓取

TeboScreen: Basic C# Screen Capture Application
源英文文档 <http://www.codeproject.com/KB/cs/TeboScreen.aspx>
翻译:白水 引用请注明出处 <敏捷学院>

源代码下载:http://dev.mjxy.cn/a-CSharp-based-exercises-screen-capture.aspx

Introduction

应用程序抓取屏幕有两种不同的方式:

抓取屏幕:抓取整个屏幕,然后将图像保存到指定的图片文件中。

抓取区域:用户按住鼠标左键,绘制一个矩形,指定他们希望捕捉屏幕的一部分。在释放鼠标左键,然后指定一个文件名将扑捉到的矩形图像保存到指定的文件中。

背景

这个应用程序是我一个C#学习的练习。我想看看使用C#如何简单的创建一个屏幕保存 程序,最后我花了一个下午的时间写应用程序。

我决定使用一个简单的方式来解决如何让用户在屏幕上画一个矩形。最大化应用程序窗口,并使它透明度为30%。先绘制一个矩形,然后使用窗体背景色绘制一个矩形用来擦出以前的矩形。由于窗体是最大化的,任何坐标位置正好对应屏幕上的坐标。ScreenShot.CaptureImage方法绘制矩形并返回矩形的坐标。

代码分析

两个模块实现屏幕抓取

Capture Screen

我们需要做的就是将屏幕的区域传递给ScreenShot.CaptureImage方法。这里唯一需要注意的地方就是我们暂停了250毫秒,让屏幕重绘。如果不这样做,直接执行下一行代码,我们应用程序的本身也会被扑捉到。

 
1//Allow 250 milliseconds for the screen to repaint itself
2  
3//(we don't want to include this form in the capture)
4  
5System.Threading.Thread.Sleep(250);
6  
7Rectangle bounds = Screen.GetBounds(Screen.GetBounds(Point.Empty));
8  
9ScreenShot.CaptureImage(Point.Empty, Point.Empty, bounds, ScreenPath);

捕抓一个区域

用户按住鼠标左键,绘制一个矩形,指定他们希望捕捉屏幕的一部分。在释放鼠标左键,然后指定一个文件名将扑捉到的矩形图像保存到指定的文件中。mouse_Move事件用来擦除之前绘制的矩形。

01private void mouse_Move(object sender, MouseEventArgs e)
02  
03        {
04  
05        //Resize (actually delete then re-draw) the rectangle if the left
06  
07        mouse button is held down
08  
09        if (LeftButtonDown)
10  
11            {
12  
13            //Erase the previous rectangle
14  
15            g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y,CurrentBottomRight.X - CurrentTopLeft.X, CurrentBottomRight.Y -
16  
17CurrentTopLeft.Y);
18  
19            //Calculate X Coordinates
20  
21            if (Cursor.Position.X < ClickPoint.X)
22  
23                {
24  
25                CurrentTopLeft.X = Cursor.Position.X;
26  
27                CurrentBottomRight.X = ClickPoint.X;
28  
29                }
30  
31            else
32  
33                {
34  
35                CurrentTopLeft.X = ClickPoint.X;
36  
37                CurrentBottomRight.X = Cursor.Position.X;
38  
39                }
40  
41            //Calculate Y Coordinates
42  
43            if (Cursor.Position.Y < ClickPoint.Y)
44  
45                {
46  
47                CurrentTopLeft.Y = Cursor.Position.Y;
48  
49                CurrentBottomRight.Y = ClickPoint.Y;
50  
51                }
52  
53            else
54  
55                {
56  
57                CurrentTopLeft.Y = ClickPoint.Y;
58  
59                CurrentBottomRight.Y = Cursor.Position.Y;
60  
61                }
62  
63            //Draw a new rectangle
64  
65            g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y,CurrentBottomRight.X - CurrentTopLeft.X, CurrentBottomRight.Y - CurrentTopLeft.Y);
66  
67            }
68  
69        }

这里是调用ScreenShot.CaptureImage如何捕抓一个区域。

 
1Point StartPoint = new Point(ClickPoint.X, ClickPoint.Y);
2Rectangle bounds = new Rectangle(ClickPoint.X, ClickPoint.Y, CurrentPoint.X - ClickPoint.X, CurrentPoint.Y - ClickPoint.Y);
3ScreenShot.CaptureImage(StartPoint, Point.Empty, bounds, ScreenPath);

捕抓屏幕的代码定义在类ScreenShot中,包含一个静态的方法CaptureImage。

 
01     class ScreenShot
02  
03     {
04  
05     public static void CaptureImage(Point SourcePoint, Point DestinationPoint,
06  
07         Rectangle SelectionRectangle, string FilePath)
08  
09         {
10  
11         using (Bitmap bitmap = new Bitmap(SelectionRectangle.Width,
12  
13             SelectionRectangle.Height))
14  
15             {
16  
17             using (Graphics g = Graphics.FromImage(bitmap))
18  
19                 {
20  
21                 g.CopyFromScreen(SourcePoint, DestinationPoint,
22  
23                     SelectionRectangle.Size);
24  
25                 }
26  
27             bitmap.Save(FilePath, ImageFormat.Bmp);
28  
29             }
30  
31         }
32  
33     }

转载于:https://www.cnblogs.com/xingquan/archive/2011/07/18/2109591.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值