基本的c#屏幕截图应用程序

摘要:
绘制后,可以在双击保存图像之前调整屏幕上的矩形大小并移动矩形。背景这个应用程序是我用c#设置的练习。作为c#的新手,我想看看创建一个截图应用程序有多简单。最后,我花了一个下午写了这个申请。该应用程序将表单的透明度最大化为30%。然后,您可以简单地将绘制的矩形的坐标返回到屏幕截图。这里唯一需要注意的是,我们暂停了250毫秒,以允许屏幕重新绘制自己。捕获该区域的捕获图像。

Screenshot - 介绍 这个应用程序以两种不同的方式捕捉屏幕: 捕捉屏幕:这是什么是说;一旦指定了结果图像的文件名,它基本上就会捕获整个屏幕。捕获区域:按住鼠标左键,用户绘制一个矩形,指定希望捕获屏幕的哪一部分。在双击时,用户选择一个文件名,绘制的矩形后面的区域将捕获到该文件。绘制之后,可以在双击保存图像之前调整矩形的大小并在屏幕上移动。 背景 这个应用程序是我自己用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

免责声明:文章转载自《基本的c#屏幕截图应用程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cesium 做汉化的另一种思路。[转]博雅大数据机器学习十讲第三讲下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用Navicat Premium图标编辑器创建表的方法

Navicat Premium 作为一款常见的数据库管理工具,功能非常的强大。其中图表编辑器由画布和垂直的工具栏组成,方便设计图表,例如添加对象、设置图表格式和打印模型等。一些新手用户对这方面的使用不是很了解,下面给大家分享一下用Navicat Premium图标编辑器创建表的方法? 点击“新建图表”即可创建一个新的图表。 创建一个新的表,从图表工具栏点击...

C#程序员开发WinForm必须知道的 Window 消息大全(转)

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows...

python控制windows剪贴板,向剪贴板中写入图片

from ctypes import * import os import win32con,win32clipboard aString=windll.user32.LoadImageW(0,"new.bmp",win32con.IMAGE_BITMAP,0,0,win32con.LR_LOADFROMFILE) print(aString) if...

将WPF UI单元复制到“.NET研究”剪贴板 狼人:

大家在日常工作中应该遇到过这样的问题:需要对应用程序界面进行截屏操作,然后将截屏内容拷贝到其他文档中使用。通常情况下我们会使用一些截屏软件或者“Ctrl+PrtSc ”,本篇将介绍如何在WPF 程序中将UI 单元直接以图片形式复制到剪贴板,以达到为应用程序界面制作快照(Snapshot)的功能。 以我之前做过的一个“WPF 员工卡”的文章为例。首先,要为程...

如何将文件拷贝到剪贴板

怎样判断当前剪贴板中的内容为文件,如何将指定文件(不是文件内容)拷贝到剪贴板中。请问各位大侠:怎样判断当前剪贴板中的内容为文件,如何将指定文件(不是文件内容)拷贝到剪贴板中。int GetClipboardFormatName(  UINT format,            // clipboard format to retrieve  LPTSTR...

windows剪贴板

标准剪贴板数据格式 CF_TEXT CF_OEMTEXT CF_UNICODETEXT CF_LOCALE CF_SYLK:包含“符号链接”数据格式的全局内存块 CF_DIF:包含数据交换格式(DIF)的数据的全局内存块 CF_BITMAP 与设备有关的位图格式 CF_DIB 设备无关的位图的内存块,这种内存块是以位图信息结构开始的,后跟可用的颜色表和位图...