介绍 这个应用程序以两种不同的方式捕捉屏幕: 捕捉屏幕:这是什么是说;一旦指定了结果图像的文件名,它基本上就会捕获整个屏幕。捕获区域:按住鼠标左键,用户绘制一个矩形,指定希望捕获屏幕的哪一部分。在双击时,用户选择一个文件名,绘制的矩形后面的区域将捕获到该文件。绘制之后,可以在双击保存图像之前调整矩形的大小并在屏幕上移动。 背景 这个应用程序是我自己用c#设置的练习。作为c#的新手,我想看看创建一个屏幕截图应用程序有多简单。最后,我花了一个下午的时间来编写这个应用程序(不太麻烦)。 我决定使用一个简单的解决方案来解决如何允许用户在屏幕上绘制矩形的问题。该应用程序将表单的透明度最大化为30%。矩形的绘制包括绘制一个矩形,然后用窗体的背景颜色绘制一个矩形来擦除前面的矩形。当表单最大化时,表单上的任何坐标都对应于下面的屏幕坐标。然后就可以简单地将所画矩形的坐标返回到屏幕截图。CaptureImage方法。 一些附加功能包括将图像保存到剪贴板,在图像中包含光标(在本例中,通过按\'S\'键),以及允许用户在绘制了初始选择区域后调整大小并拖动选择区域。 使用的代码 屏幕捕获有两种模式——捕获屏幕和捕获区域。 捕捉屏幕 我们所需要做的就是将屏幕区域传递给屏幕截图。CaptureImage方法。这里唯一需要注意的是,我们暂停了250毫秒,以允许屏幕重新绘制自己。如果不这样做,可能会导致调用命令的表单被包含在捕获中,即使它已经被指示最小化。 隐藏,复制Code
//Allow 250 milliseconds for the screen to repaint itself //(we don\'t want to include this form in the capture) System.Threading.Thread.Sleep(250); Rectangle bounds = Screen.GetBounds(Screen.GetBounds(Point.Empty)); string fi = ""; if (ScreenPath != "") { fi = new FileInfo(ScreenPath).Extension; } ScreenShot.CaptureImage(showCursor, curSize, curPos, Point.Empty, Point.Empty, bounds, ScreenPath, fi);
捕获区 按住鼠标左键,用户将绘制一个矩形,指定希望捕捉屏幕的哪一部分。在释放鼠标左键时,用户可以调整大小或移动选择区域,或者双击以选择文件名——绘制矩形后的内容将被捕获到选定的文件中。mouse_Move事件用于决定用户是在绘制、拖动(移动)还是调整选择区域的大小。每一个方法都会擦除前面的矩形,并在每次移动鼠标(按住鼠标左键时)时创建一个新矩形。这给了一个矩形移动的错觉。 隐藏,复制Code
private void mouse_Move(object sender, MouseEventArgs e) { if (LeftButtonDown && !RectangleDrawn) { DrawSelection(); } if (RectangleDrawn) { CursorPosition(); if (CurrentAction == ClickAction.Dragging) { DragSelection(); } if (CurrentAction != ClickAction.Dragging && CurrentAction != ClickAction.Outside) { ResizeSelection(); } } }
下面是截屏。捕获区域的捕获图像。 隐藏,复制Code
Point StartPoint = new Point(CurrentTopLeft.X, CurrentTopLeft.Y); Rectangle bounds = new Rectangle(CurrentTopLeft.X, CurrentTopLeft.Y, CurrentBottomRight.X - CurrentTopLeft.X, CurrentBottomRight.Y - CurrentTopLeft.Y); ... ScreenShot.CaptureImage(showCursor, curSize, curPos, StartPoint, Point.Empty, bounds, ScreenPath, fi);
捕捉屏幕的代码在一个名为ScreenShot的类中,该类包含一个名为CaptureImage的静态方法。这是代码应用所有选中选项的地方——包括/排除光标、保存到剪贴板/文件和图像保存到的文件类型。 隐藏,收缩,复制Code
class ScreenShot { public static bool saveToClipboard = false; public static void CaptureImage(bool showCursor, Size curSize, Point curPos, Point SourcePoint, Point DestinationPoint, Rectangle SelectionRectangle, string FilePath, string extension) { using (Bitmap bitmap = new Bitmap(SelectionRectangle.Width, SelectionRectangle.Height)) { using (Graphics g = Graphics.FromImage(bitmap)) { g.CopyFromScreen(SourcePoint, DestinationPoint, SelectionRectangle.Size); if (showCursor) { Rectangle cursorBounds = new Rectangle(curPos, curSize); Cursors.Default.Draw(g, cursorBounds); } } if (saveToClipboard) { Image img = (Image)bitmap; Clipboard.SetImage(img); } else { switch (extension) { case ".bmp": bitmap.Save(FilePath, ImageFormat.Bmp); break; case ".jpg": bitmap.Save(FilePath, ImageFormat.Jpeg); break; case ".gif": bitmap.Save(FilePath, ImageFormat.Gif); break; case ".tiff": bitmap.Save(FilePath, ImageFormat.Tiff); break; case ".png": bitmap.Save(FilePath, ImageFormat.Png); break; default: bitmap.Save(FilePath, ImageFormat.Jpeg); break; } } } }
最近(2012年1月)添加的两个方法是Clipboard。SetImage Cursors.Default.Draw。第一种方法将屏幕或区域复制到剪贴板,第二种方法在图像中包含光标(作为箭头)。如果您需要在屏幕截图中指出一些东西,比如按钮,那么添加光标就特别有用。 为了将光标包含在图像中,应用程序的KeyUp事件侦听\'S\'键——这将触发指定光标包含的ScreenCapture方法。我有这个事件添加到应用程序上的每个按钮——一个更有效的方法是处理任何键按下在应用程序打开时,我选择这个方法的原因是,这样软件是不会标记为关键日志的安全软件。 隐藏,复制Code
private void keyTest(KeyEventArgs e) { if (e.KeyCode.ToString() == "S") { screenCapture(true); } }
光标和剪贴板功能的增加都来自于请求,所以请保留建议和请求,因为我倾向于处理它们。 我也知道Windows 7现在附带了一个剪切工具——这篇文章最初是在2007年Windows 7发布之前写的。我觉得这篇文章在说明在屏幕上绘制和移动物体以及截屏方面仍然有一些相关性。 发展 TeboScreen已经被扩展到Patrick Harris的一个名为ScreenCap的新项目和文章中。ScreenCap提供的额外功能包括: 在后台运行,并在按下打印屏幕按钮时激活。支持双显示器,无论显示器的大小是否不同。自动发送屏幕截图到三个设备:剪贴板,打印机和电子邮件。 作为一名开发人员,我很高兴我很期待看到Patrick将这个新分支带到哪里去。 历史 2007年12月18日-下载和文章内容更新 新的下载代码修复了mouse_Move事件的选择矩形替换文章文本的绘图错误 2011年7月3日——更新的代码包括允许用户调整大小和移动图像捕获选择区域的更改。还有一个提示按钮,点击后会显示基本的使用说明。2011年12月28日——下载更新的2012年1月19日——文章和下载更新的2012年2月18日——为了参考Patrick Harris的ScreenCap文章添加的内容 本文转载于:http://www.diyabc.com/frontweb/news292.html