iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现截图工具小项目
  • 659
分享到

C#实现截图工具小项目

2024-04-02 19:04:59 659人浏览 泡泡鱼
摘要

本文实例为大家分享了C#实现截图工具小项目的具体代码,供大家参考,具体内容如下 1.起因 一直用的截图是qq的截图,所以想要实现一个简单点的截图,为了方便。 2.思路 讲一下实现流程

本文实例为大家分享了C#实现截图工具项目的具体代码,供大家参考,具体内容如下

1.起因

一直用的截图是qq的截图,所以想要实现一个简单点的截图,为了方便。

2.思路

讲一下实现流程。

1、主窗体,上有截图按钮,点击进入截图窗体
2、在截图窗体中,背景设置为全屏幕的截图图片,无边框,窗体最大化,这时你看到的就是一张屏幕图,其实是一个窗体,然后我们将在这个窗体中截取图片,其实主要就是画板Graphics的使用,截取完之后图片将保存到剪切板。

3.代码

热键注册类   HoTKEy.cs


using System;
using System.Runtime.InteropServices;
using System.windows.FORMs;
 
namespace test {
    /// <summary>
    /// 热键类
    /// </summary>
    public class HotKey {
        /// <summary>
        /// 如果函数执行成功,返回值不为0,如果执行失败,返回值为0
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool ReGISterHotKey(
            IntPtr hWnd,           // 窗口的句柄, 当热键按下时,会产生WM_HOTKEY信息,该信息该会发送该窗口句柄
            int id,                      // 定义热键ID,属于唯一标识热键的作用
            uint fsModifiers,            // 热键只有在按下Alt、 Ctrl、Shift、Windows等键时才会生效,即才会产生WM_HOTKEY信息
            Keys vk                   // 虚拟键,即按了Alt+Ctrl+ X ,X就是代表虚拟键
            );
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                   // 窗口句柄
            int id                         // 要取消热键的ID
            );
    }
}

主窗体  Form1.cs


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Timers;
using System.Windows.Forms;
 
namespace test {
    public partial class Form1 : Form {
 
        [Flags]
        public enum KeyModifiers { //定义热键值字符串(热键值是系统规定的,不能改变)
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
 
        public Form1() {
            InitializeComponent();
        }
 
        //窗体加载时-注册快捷键
        private void Form1_Load(object sender, EventArgs e) {
            uint ctrlHotKey = (uint)(KeyModifiers.Alt | KeyModifiers.Ctrl);
            // 注册热键为Alt+Ctrl+A, "100"为唯一标识热键
            HotKey.RegisterHotKey(Handle,100,ctrlHotKey,Keys.A);
        }
 
        //截图按钮
        private void button1_Click(object sender, EventArgs e) {
            if (this.WindowState != FormWindowState.Minimized) {
                this.WindowState = FormWindowState.Minimized;
                Thread.Sleep(200);
            }
            int swidth = Screen.PrimaryScreen.Bounds.Width;
            int sheight = Screen.PrimaryScreen.Bounds.Height;
            Bitmap btm = new Bitmap(swidth,sheight); //空图与屏幕同大小
            Graphics g = Graphics.FromImage(btm); //空图的画板
            g.CopyFromScreen(new Point(0,0),new Point(0,0),new Size(swidth,sheight)); //将屏幕内容复制到空图
            Cutter cutter = new Cutter(btm); //传送截图
            cutter.FormBorderStyle = FormBorderStyle.None; //截图全屏,无边框
            cutter.BackgroundImage = btm; //新的窗体截图做背景
            cutter.Show();
        }
        private void tiaoZ(object sender, ElapsedEventArgs e) {
        }
        
 
        //窗体关闭-取消热键
        private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
            HotKey.UnregisterHotKey(Handle,100);
        }
 
        //快捷键按下执行的事件
        private void GlobalKeyProcess() {
            this.WindowState = FormWindowState.Minimized;
            Thread.Sleep(200);
            button1.PerformClick();
        }
 
        //重写。监视系统消息,调用对应方法
        protected override void WndProc(ref Message m) {
            const int WM_HOTKEY = 0x0312;
            //如果m.Msg的值为0x0312(我也不知道为什么是0x0312)那么表示用户按下了热键
            switch (m.Msg) {
                case WM_HOTKEY:
                    if (m.WParam.ToString().Equals("100")) {
                        GlobalKeyProcess();
                    }
                    //todo  其它热键
                    break;
            }
            // 将系统消息传递自父类的WndProc
            base.WndProc(ref m);
        }
    }
}

截图窗体-核心 Cutter.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace test {
    public partial class Cutter : Form {
        Bitmap screenBtmp = null; //电脑屏幕的截图
 
        public Cutter(Bitmap btm) {
            InitializeComponent();
            screenBtmp = btm;
        }
 
        //鼠标右键退出
        private void Cutter_MouseClick(object sender, MouseEventArgs e) {
            if (e.Button == MouseButtons.Right) {
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }
 
        bool CatchStart = false; //自由截图开始
        Point downPoint; //初始点
        //鼠标左键按下-开始自由截图
        private void Cutter_MouseDown(object sender, MouseEventArgs e) {
            if (e.Button == MouseButtons.Left) {
                if (!CatchStart) {
                    CatchStart = true;
                    downPoint = new Point(e.X,e.Y); //初始点
                }
            }
        }
 
        Rectangle catchRec;//存放截取范围
        //鼠标移动-绘制自由截图路径
        private void Cutter_MouseMove(object sender, MouseEventArgs e) { //路径绘制,核心
            if (CatchStart) {
                //
                //二次缓冲
                //不是直接在控件的背景画板上进行绘制鼠标移动路径,那样会造成绘制很多路径,因为前面绘制的路径还在
                //而是在内存中每移动一次鼠标就创建一张和屏幕截图一样的新BImtap,在这个Bitmap中绘制鼠标移动路径
                //然后在窗体背景画板上,绘制这个新的Bitmap,这样就不会造成绘制很多路径,因为每次都绘制了全新的Bitmao
                //但是这样做的话,因为鼠标移动的次数是大量的,所以在内存中会创建大量的Bitmap会造成内存消耗严重,所以每次移动绘制完后,
                //需要释放Dispose() 画板,画笔,Bitmap资源。
                //
                Bitmap copyBtmp = (Bitmap)screenBtmp.Clone(); //创建新的,在其上绘制路径
                //左上角
                Point firstP = new Point(downPoint.X,downPoint.Y);
                //新建画板,画笔
                Graphics g = Graphics.FromImage(copyBtmp);
                Pen p = new Pen(Color.Red,1);
                //计算路径范围
                int width = Math.Abs(e.X - downPoint.X);
                int height = Math.Abs(e.Y - downPoint.Y);
                if (e.X < downPoint.X) {
                    firstP.X = e.X;
                }
                if (e.Y < downPoint.Y) {
                    firstP.Y = e.Y;
                }
                //绘制路径
                catchRec = new Rectangle(firstP,new Size(width,height));
                //将路径绘制在新的BItmap上,之后要释放
                g.DrawRectangle(p, catchRec);
                g.Dispose();
                p.Dispose();
 
                //窗体背景画板
                Graphics gf = this.CreateGraphics();
                //将新图绘制在窗体的画板上   --   自由截图-路径绘制处,其实还是一张和屏幕同样大小的图片,只不过上面有红色的选择路径
                gf.DrawImage(copyBtmp,new Point(0,0));
                gf.Dispose();
                //释放内存Bimtap
                copyBtmp.Dispose();
                
            }
        }
 
        bool catchFinished = false; //自由截图结束标志
        //鼠标左键弹起-结束自由截图
        private void Cutter_MouseUp(object sender, MouseEventArgs e) {
            if (e.Button == MouseButtons.Left) {
                if (CatchStart) {
                    CatchStart = false;
                    catchFinished = true;
                }
            }
        }
 
        //鼠标左键双击,保存自由截取的图片
        private void Cutter_MouseDoubleClick(object sender, MouseEventArgs e) {
            if((e.Button == MouseButtons.Left) && catchFinished){
                //创建用户截取的范围大小的空图
                Bitmap catchBtmp = new Bitmap(catchRec.Width,catchRec.Height);
                Graphics g = Graphics.FromImage(catchBtmp);
                //在原始的屏幕截图ScreenBitmap上 截取 用户选择范围大小的区域   绘制到上面的空图
                //绘制完后,这个空图就是我们想要的截取的图片
                //参数1  原图
                //参数2  在空图上绘制的范围区域
                //参数3  原图的截取范围
                //参数4  度量单位
                g.DrawImage(screenBtmp,new Rectangle(0,0,catchRec.Width,catchRec.Height),catchRec,GraphicsUnit.Pixel);
 
                //将自由截取的图片保存到剪切板中
                Clipboard.Clear();
                Clipboard.SetImage(catchBtmp);
                g.Dispose();
                catchFinished = false;
                this.BackgroundImage = screenBtmp;
                catchBtmp.Dispose();
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#实现截图工具小项目

本文链接: https://www.lsjlt.com/news/131121.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#实现截图工具小项目
    本文实例为大家分享了C#实现截图工具小项目的具体代码,供大家参考,具体内容如下 1.起因 一直用的截图是qq的截图,所以想要实现一个简单点的截图,为了方便。 2.思路 讲一下实现流程...
    99+
    2022-11-12
  • Java如何实现截图小工具
    这篇文章主要介绍“Java如何实现截图小工具”,在日常操作中,相信很多人在Java如何实现截图小工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何实现截图小工具”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • Java实现截图小工具的完整代码
    目录写在前面效果展示代码展示项目结构设计思路项目测试写在前面 今天利用Java的图形用户界面GUI技术写了一个电脑截图小工具。本程序代码简单,涉及到异常处理,事件处理,图形用户界面等...
    99+
    2022-11-13
  • Maven实现项目构建工具
    目录1.Maven介绍1.1Maven是什么1.2为什么要使用maven2.Maven安装2.1下载Maven:2.2解压并配置2.3编辑Maven环境变量3.Maven配置3.1仓...
    99+
    2022-11-13
  • vue项目中canvas实现截图功能
    本文实例为大家分享了vue项目中canvas实现截图功能的具体代码,供大家参考,具体内容如下 实现效果: 整理一下最近在vue项目中做的一个截图功能(只能够截取图片),即用鼠标在画...
    99+
    2022-09-27
  • C++实现推箱子小项目
    本文实例为大家分享了C++实现推箱子小项目的具体代码,供大家参考,具体内容如下 代码: #include <bits/stdc++.h> #include<c...
    99+
    2022-11-12
  • Android实现折线图小工具
    本文实例为大家分享了Android实现折线图小工具的具体代码,供大家参考,具体内容如下 1.LineChart类 public class LineChart extends Vie...
    99+
    2022-11-13
  • 微信小程序项目实例——图片处理小工具(自制低配版美图秀秀)
    微信小程序项目实例——图片处理小工具(自制低配版美图秀秀) 文章目录 微信小程序项目实例——图片处理小工具(自制低配版美图秀秀)一、项目展示二、滤镜三、效果图四、动态滤镜文末 项目代码见文...
    99+
    2023-09-01
    微信小程序 小程序 javascript android ios
  • C语言实现扫雷小项目
    本文实例为大家分享了C语言实现扫雷小项目的具体代码,供大家参考,具体内容如下 游戏的基本设计流程如下: 菜单实现: void menu() { printf("#######...
    99+
    2022-11-12
  • python编写adb截图工具的实现源码
    目录一、 功能二、使用说明三、实现1.初始源码2.优化:增加ip连接断开重连处理一、 功能 Android端或者Android终端的远程截图至本地电脑中 二、使用说明 adb截图工具可用于Android手机及And...
    99+
    2022-06-02
    python adb截图工具 python 截图工具
  • Android实现圆形图片小工具
    本文实例为大家分享了Android实现圆形图片小工具的具体代码,供大家参考,具体内容如下 1.CircleImageView类代码 public class CircleImageV...
    99+
    2022-11-13
  • C语言实现通讯录小项目
    本文实例为大家分享了C语言实现通讯录小项目的具体代码,供大家参考,具体内容如下 编写程序实现通讯录的基本功能,可以做到增,删,查,改,打印通讯录,等等功能 test.c #inc...
    99+
    2022-11-12
  • C语言实现猜数字小项目
    学习完c语言循环、选择内容,我们对c语言有个初步的认识了,让我们来实现一个小项目吧!!! 1.猜数字小项目分析: 我们利用c语言制造出随机数来猜,在只知道范围的前提下我们无非有以下三...
    99+
    2022-11-12
  • C语言实现弹跳小球项目
    目录一、项目描述和最终项目展示二、输出一个小球三、下落的小球四、来回弹跳的小球五、最终项目实现本文实例为大家分享了C语言实现弹跳小球项的具体代码,供大家参考,具体内容如下 一、项目描...
    99+
    2022-11-13
  • 怎么用Maven实现项目构建工具
    本篇内容主要讲解“怎么用Maven实现项目构建工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Maven实现项目构建工具”吧!1.Maven介绍1.1Maven是什么Maven项目对象模...
    99+
    2023-07-02
  • 利用Python实现一个简易的截图工具
    这是工作期间同事想要个截完图之后可以显示并且永远前置的截图小工具(即不会被其他程序覆盖)直接上代码: # # -*- coding: utf-8 -*- import tkinter...
    99+
    2022-11-11
  • Java实现屏幕截图工具的代码分享
    目录效果展示程序结构核心代码效果展示 程序运行后的截图: 先测试一下功能: 截图过程对界面的捕捉: 双击保存后的显示界面: 后续的步骤就自己去尝试吧,这里给出了简单的测试过程。...
    99+
    2022-11-13
  • C语言实现扫雷游戏小项目
    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.基本实现功能 1.建立一个游戏菜单 2.创建游戏盘,一个埋雷,一个显示。 3.打印游戏盘。 4.翻开坐...
    99+
    2022-11-12
  • C++实现结束应用进程小工具
    C++实现结束应用进程小工具(windows) 说明: 在电脑上一些软件或系统有时可能会将程序偷偷运行在后台,占用计算机资源的情况。一般我们通过可以找到程序文件所在位置,禁止程序启动...
    99+
    2022-11-12
  • vue项目中怎么使用canvas实现截图功能
    本文小编为大家详细介绍“vue项目中怎么使用canvas实现截图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中怎么使用canvas实现截图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作