C#实现截图工具小项目

下面是详细的C#实现截图工具小项目攻略。

一、项目背景

截图工具是一款在电脑操作中十分常用的小工具,通过对电脑屏幕进行截图来方便用户进行操作、记录等。而使用C#进行开发,同样可以实现一个简单易用的截图工具,因此本篇攻略主要讲解如何使用C#实现截图工具。

二、开发准备

  1. 开发工具:Visual Studio或Visual Studio Code(推荐使用Visual Studio,因为Visual Studio内置了更多的开发辅助工具)
  2. 运行环境:.NET Framework(目前新版已经升级至.NET Core)

三、项目实现

1.准备工作

我们需要在窗体中添加一个PictureBox控件,用来显示截图内容。可以通过拖拽的方式将PictureBox控件添加进窗体。

2.截屏实现

我们可以使用C#中的Screen类来获取屏幕的信息,以及使用Graphics类来进行绘制。以下是C#实现截图的代码:

   public static Image CaptureScreen()
   {
       Rectangle screenSize = Screen.PrimaryScreen.Bounds;
       Bitmap result = new Bitmap(screenSize.Width, screenSize.Height);
       using (Graphics g = Graphics.FromImage(result))
       {
           g.CopyFromScreen(screenSize.Left, screenSize.Top, 0, 0, screenSize.Size);
       }
       return result;
   }

首先通过Screen.PrimaryScreen.Bounds获取屏幕信息,并新建一个大小与屏幕信息相同的Bitmap对象result。然后使用Graphics.FromImage(result)获取Bitmap对象所对应的Graphics对象,最后通过g.CopyFromScreen获取屏幕截图。

3.绘制选区

在截屏时,我们可能只需要其中的一部分内容。因此,我们需要先绘制一个选区框,来指定我们所需要的内容。下面的代码将绘制一个红色边框的方框:

    public static void DrawRectangle(Graphics g, int x1, int y1, int x2, int y2)
    {
        int xmin = Math.Min(x1, x2);
        int ymin = Math.Min(y1, y2);
        int width = Math.Abs(x1 - x2);
        int height = Math.Abs(y1 - y2);
        var pen = new Pen(Color.Red);
        g.DrawRectangle(pen, xmin, ymin, width, height);
    }

4.实现

通过鼠标的移动与点击事件来实现截图并显示选中区域的内容,以下是完整代码:

public partial class Form1 : Form
{
    private Point startPoint;
    private Rectangle rect;
    private bool isMouseDown = false;
    private Image screenShot;

    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
        this.FormBorderStyle = FormBorderStyle.None;  
        this.WindowState = FormWindowState.Maximized; 
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        startPoint = e.Location;
        isMouseDown = true;
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        isMouseDown = false;
        this.Hide();
        Thread.Sleep(200);
        using (var bmp = new Bitmap(rect.Width, rect.Height))
        using (var g = Graphics.FromImage(bmp))
        {
            g.DrawImage(screenShot, new Rectangle(0, 0, bmp.Width, bmp.Height), rect, GraphicsUnit.Pixel);
            g.Save();
            pictureBox1.Image = bmp;
        }
        this.Close();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            var current = e.Location;
            rect = new Rectangle
            {
                X = Math.Min(startPoint.X, current.X),
                Y = Math.Min(startPoint.Y, current.Y),
                Width = Math.Abs(startPoint.X - current.X),
                Height = Math.Abs(startPoint.Y - current.Y)
            };
            using (var g = CreateGraphics())
            {
                g.DrawImage(screenShot, new Rectangle(0, 0, Size.Width, Size.Height), 0, 0, screenShot.Width, screenShot.Height, GraphicsUnit.Pixel);
                DrawRectangle(g, rect.Left, rect.Top, rect.Right, rect.Bottom);
            }
        }
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape) 
        {
            this.Close();
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        screenShot = CaptureScreen();
        this.BackgroundImage = screenShot;
        this.Size = screenShot.Size;
    }

    public static Image CaptureScreen()
    {
        Rectangle screenSize = Screen.PrimaryScreen.Bounds;
        Bitmap result = new Bitmap(screenSize.Width, screenSize.Height);
        using (Graphics g = Graphics.FromImage(result))
        {
            g.CopyFromScreen(screenSize.Left, screenSize.Top, 0, 0, screenSize.Size);
        }
        return result;
    }

    public static void DrawRectangle(Graphics g, int x1, int y1, int x2, int y2)
    {
        int xmin = Math.Min(x1, x2);
        int ymin = Math.Min(y1, y2);
        int width = Math.Abs(x1 - x2);
        int height = Math.Abs(y1 - y2);
        var pen = new Pen(Color.Red);
        g.DrawRectangle(pen, xmin, ymin, width, height);
    }
}

其中,CaptureScreen()方法是用于截取屏幕原始画面的,DrawRectangle()方法是用于绘制选区框的。

四、项目应用

以上代码实现了截屏、绘制选区框和选中区域显示,最后形成了一个完整的截图工具。

以下是一个使用截图工具进行截图并保存到本地的代码示例:

private void btnScreenShot_Click(object sender, EventArgs e)
{
    var form = new Form1();
    form.ShowDialog();
    if (form.pictureBox1.Image != null)
    {
        var saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "jpg files (*.jpg)|*.jpg|png files (*.png)|*.png|bmp files (*.bmp)|*.bmp";
        saveFileDialog1.FilterIndex = 1;
        saveFileDialog1.RestoreDirectory = true;
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            var file = saveFileDialog1.FileName;
            form.pictureBox1.Image.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg); // 其他文件格式需要修改此处
            MessageBox.Show("截图已成功保存到:" + file);
        }
    }
}

该代码通过点击Button按钮调用新建的窗体Form1,截取到选取的屏幕区域,并将截图保存到本地。保存的文件格式可以通过代码中的System.Drawing.Imaging.ImageFormat.Jpeg进行修改。

总结

C#实现截图工具相对简单,代码实现也比较容易理解。在开发过程中我们主要是通过一些C#内置的类以及对窗体的操作进行实现,最终形成一个有用的工具。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现截图工具小项目 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • RandomId生成随机字符串详解实例

    RandomId生成随机字符串详解实例 介绍 在软件开发中,为了满足不同的需求,我们经常需要生成随机字符串进行使用。本篇文章将介绍RandomId生成随机字符串的详细过程,以及具体的示例说明。 准备工作 在使用RandomId生成随机字符串之前,需要在项目中引入RandomId的相关代码。可以使用以下语句进行安装: npm install randomid …

    C# 2023年6月7日
    00
  • C#实现Ping的方法小结

    C#实现Ping的方法小结 1. 简介 Ping是一种常用的测试网络连接的工具,可以测试网络延迟和连接状况,以及判断网络是否可用。在C#中也可以通过系统自带的Ping类来实现Ping功能。 2. Ping的基础使用 2.1 创建Ping实例 在使用Ping功能之前,需要创建一个Ping实例。使用如下代码可创建一个实例: Ping pingSender = n…

    C# 2023年6月7日
    00
  • C#在Winform开发中使用Grid++报表

    C#是一种流行的编程语言,可以用于Windows窗体开发。在Winform开发中,Grid++报表是一种流行的报表生成工具,可以方便地生成各种报表。下面是详细的攻略: 准备工作 在使用Grid++报表前,需要先下载并安装Grid++ Report软件。安装完成后,需要将Grid++ Report的.NET程序集引入到项目中,以便使用Grid++ Report…

    C# 2023年6月1日
    00
  • 浅谈C#中ToString()和Convert.ToString()的区别

    有关C#语言中的数据类型转换,ToString() 和 Convert.ToString() 都是常用的方法,它们有很多相似之处,但也有一些区别。本文将详细讲解其区别,供大家参考。 ToString()方法 ToString() 是一个用于将对象转换为字符串的方法。它可以用于常见的数据类型,如整数、浮点数、Boolean 等,但必须在该数据类型的上下文中使用…

    C# 2023年5月15日
    00
  • 区分c# 前台和后台线程

    要区分C#前台和后台线程,主要是要理解它们之间的区别以及相应的使用场景。以下是区分C#前台和后台线程的完整攻略: 什么是前台线程和后台线程 前台线程 前台线程是指在应用程序的主线程中创建的线程,这些线程会阻止应用程序的终止,只有在所有前台线程执行完成后应用程序才会退出。 后台线程 后台线程是指在应用程序中创建的没有阻止应用程序终止的线程,当所有前台线程都执行…

    C# 2023年6月7日
    00
  • C#影院售票系统毕业设计(1)

    下面逐步讲解“C#影院售票系统毕业设计(1)”的完整攻略。 1. 确定项目需求 要开发一个影院售票系统,需要满足以下需求: 用户端 用户可以通过图形化操作,实现选座、支付等功能; 可以查看影片排片信息、影院信息、个人信息等; 可以对已完成订单进行评价和投诉; 实现基本的安全性,如密码保护等。 管理员端 管理员可以通过图形化界面添加、修改、删除影片和影院信息;…

    C# 2023年6月1日
    00
  • 微信小程序uniapp实现左滑删除效果(完整代码)

    微信小程序uniapp实现左滑删除效果是一种常见的交互效果,本文将详细介绍如何使用uniapp实现左滑删除效果,包括代码实现和注意事项等。 步骤一:创建uniapp项目 首先,我们需要创建一个uniapp项目。可以使用HBuilderX等开发工具创建uniapp项目,也可以使用命令行工具创建uniapp项目。 以下是使用命令行工具创建uniapp项目的示例代…

    C# 2023年5月15日
    00
  • C# Dynamic关键字之:调用属性、方法、字段的实现方法

    C#中的 dynamic 关键字可以让我们在运行时动态地解析和调用对象的属性、方法、字段等成员,而不需要在编译时就确定这些成员的类型。这在某些情况下非常有用,例如调用不确定类型的第三方库、解析动态生成的代码等。 下面是关于如何使用 dynamic 关键字调用属性、方法、字段的实现方法: 1. 确定类型 在使用 dynamic 关键字之前,我们需要先确定被操作…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部