C#中仿QQ截图

2023-11-03

欢迎大家提出意见,一起讨论!

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

代码(VS2008):

http://www.rayfile.com/zh-cn/files/bad4b357-978a-11e1-8b2d-0015c55db73d/ 

在工作中需要抓取图片,那么就花一会儿时间用C#自己写一个吧

关键技术:

用到了Graphics类的DrawRectangle方法;

双击鼠标选择的区域保存在系统剪贴板中,这一功能通过Clipboard类的SetImage方法实现的。

(1)Graphics类的DrawRectangle方法

它用来绘制由坐标对、宽度和高度指定的矩形

//     绘制由坐标对、宽度和高度指定的矩形。

        public void DrawRectangle(Pen pen, float x, float y, float width, float height);

        (2) Glipboard类的SetImage方法

它将Bitmap数据存储在剪贴上

// 将 System.Windows.Forms.DataFormats.Bitmap 格式的 System.Drawing.Image 添加到剪贴板中。

public static void SetImage(Image image);


设计过程:

Form1窗体的后台代码中,首先获取整个屏幕的抓图,然后传递给第二个窗体

 private void button1_Click(object sender, EventArgs e)
        {
            // 创建Image对象,用于存储整个屏幕的抓图
            Image img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
            // 创建graphics对象
            Graphics g = Graphics.FromImage(img);
            // CopyFromScreen方法捕获整个屏幕图像
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
            // 获取句柄
            IntPtr dc = g.GetHdc();
            // 释放
            g.ReleaseHdc(dc);
            // 创建Frm_Browser对象
            Frm_Browser frm2 = new Frm_Browser(); 
            // 将img传递给ig
            frm2.ig = img;
            // 打开Frm_Browser窗体
            frm2.Show();
        }


Frm_Browser窗体的后台代码中,窗体的Load事件首先将Form1传递过来的屏幕图设定为窗体背景,

然后最大化。这样就可以在Frm_Browser窗体上使用鼠标选择截图的区域,以便保存

private void Frm_Browser_Load(object sender, EventArgs e)
        {
            // 将Form1传递过来的屏幕图设定为窗体背景
            this.BackgroundImage = ig;
            // 最大化窗体
            this.WindowState = FormWindowState.Maximized;
            // 创建Graphics对象
            MainPainter = this.CreateGraphics();
            pen = new Pen(Brushes.Tomato);
            // 判断鼠标是否按下
            isDowned = false;
            // 获取捕获的屏幕图像
            baseImage = this.BackgroundImage;
            // 创建Rectangle图像
            Rect = new Rectangle();
            // 是否出现边框
            RectReady = false;
            change = false;
            Rectpoints = new Rectangle[8];
            for (int i = 0; i < Rectpoints.Length; i ++ )
            {
                Rectpoints[i].Size = new Size(4, 4);
            }
        }


当鼠标移动时,会触发MouseMove事件,在此事件中,判断鼠标左键是否按下,如果按下,则开始获取鼠标拖动后的选区

private void Frm_Browser_MouseMove(object sender, MouseEventArgs e)
        {
            if (RectReady == true)
            {
                if (Rect.Contains(e.X, e.Y))
                {
                    if (isDowned == true && change == false)
                    {
                        // 和上一次的位置比较获取偏移量
                        Rect.X = Rect.X + e.X - tmpx;
                        Rect.Y = Rect.Y + e.Y - tmpy;
                        // 记录现在的位置
                        tmpx = e.X;
                        tmpy = e.Y;
                        MoveRect((Image)baseImage.Clone(), Rect);
                    }
                }
               
            } 
            else
            {
                if (isDowned == true)
                {
                    Image New = DrawScreen((Image)baseImage.Clone(), e.X, e.Y);
                    MainPainter.DrawImage(New, 0, 0);
                    New.Dispose();
                } 
                
            }
        }


 

 private void Frm_Browser_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (((MouseEventArgs)e).Button == MouseButtons.Left && Rect.Contains(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y))
            {
                Image memory = new Bitmap(Rect.Width - 1, Rect.Height - 1);
                Graphics g = Graphics.FromImage(memory);
                g.CopyFromScreen(Rect.X + 1, Rect.Y + 1, 0, 0, Rect.Size);
                Clipboard.SetImage(memory);
                this.Close();
            }
        }


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中仿QQ截图 的相关文章

  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • excel二进制移位运算_Excel揭秘13:在Excel中实现位运算

    我们知道 计算机使用的是二进制计数法 也就是说 在计算机中的所有信息都是使用二进制来存储和处理的 下表列出了我们熟悉的十进制数及与其相对应的二进制数 位运算规则 在位运算中 按位与 运算 AND运算 分别按位比较两个相应的数字 0或1 当且
  • centos7搭建svn服务器

    一 安装svn服务器 root svnserver yum y install subversion 查看svn 安装位置 可以用以下命令 root svnserver rpm ql subversion etc subversion et
  • Java中String类的使用

    目录 1 MS String 类中两种对象实例化的区别 1 1 直接赋值 1 2 构造方法 2 字符 字节与字符串 2 1 字符与字符串转换 2 2 字节与字符串转换 3 字符串常见操作 3 1 字符串比较 3 2 字符串查找 3 3 字符
  • HS BDC 【HDU - 3472】【混合半欧拉图构建欧拉图+最大流】

    题目链接 有N个字符 如果字符可以首尾相同字符相接组成一条链的话 那么就是说明是well done的 不然 就不是 所以考虑成一条边 我们把每个字符串考虑成有向边 又有些字符串是可以反转的 实际上可以把它当成是无向边来考虑 现在 就是要知道
  • idea 生成项目结构图

    Terminal中输入tree D mybatis plus generator demo gt tree 文件夹 PATH 列表 卷序列号为 ECE0 24D1 D idea inspectionProfiles libraries mv
  • Java如何将一个对象的所有字段值赋值给另一个对象?

    我们开发的时候可能需要进行对象值的复用 下面给大家介绍一个方法 就是使用BeanUtils public static void main String args throws Exception Student student new S
  • MySQL 经典练习 50 题(完美解答版)

    一 创建数据库和表 数据库 学生表 student 课程表 course 教师表 teacher 成绩表 score 表关系 创建数据库和表 创建数据库 drop database if exists mysql test cascade
  • 51单片机EEPROM(I²C总线通信)AT24C02数据存储

    一 存储器介绍 补充 1 易失性存储器 RAM 存储速度特别快但掉电丢失 SRAM 运行速度最快 用于电脑CPU 高速缓存 单片机中的SRAM 定义一个变量就会存在SRAM中 使用触发器做的 存储容量小 成本高 DRAM 运行速度仅次于SR
  • Linux的GPIO子系统解析 ( 一 ) 之 gpiolib.c

    文章目录 Linux的GPIO子系统解析 一 之 gpiolib c 绪论 关于GPIO子系统库文件的gpiolib c解析 drivers gpio gpiolib c gpio desc结构体 gpio chip结构体 gpio ens
  • ModbusSlave安装及使用指南正式版带序列码

    ModbusSlave是一个从站设备仿真软件 它用于接收主设备的命令包 并回送数据包 可用于测试和调试Modbus主站设备 便于观察Modbus通信过程中的各种报文 ModbusSlave支持ModbusRTU ASCII TCP IP等协
  • 基于Xposed hook 实时监测微信消息的三种策略

    本文以微信版本6 7 3为例进行分析有hook 大部分做微信机器人的话 首先要实时抓取微信的消息 在这里展示三种方式对微信的消息进行hook 1 基于UI层拉取加载进行监听 2 基于微信dao层调用的保存进行监听 3 基于数据库的插入保存进
  • 决策树 prepruning_数据挖掘入门系列教程(三点五)之决策树

    本来还是想像以前一样 继续学习 Python数据挖掘入门与实践 的第三章 决策树 但是这本书上来就直接给我怼了一大串代码 对于决策树基本上没有什么介绍 可直接把我给弄懵逼了 主要我只听过决策树还没有认真的了解过它 这一章节主要是对决策树做一
  • SD方法

    4 4 SD方法 结构化的设计方法 数据流图 gt 软件结构图 描述软件的结构图 层次图 结构图 SD方法 DFD gt 软件结构图 1 DFD图的类型 变换型 为核心处理准备数据 输入数据流 核心处理 变换中心 对核心处理的结果作出处理
  • CAP和BASE理论

    CAP理论 CAP是 Consistency Availability Partition tolerance 三个词语的缩写 分别表示一致性 可用性 分区容忍性 它指出一个分布式计算系统不可能同时满足以下三点 一致性 Consistenc
  • 小白学PYTHON时最容易犯的6个错误,看看你遇到过几个

    最近又在跟之前的同学一起学习python 一起进步 发现很多测试同学在初学python的时候很容易犯一些错误 特意总结了一下 其实这些错误不仅是在学python时会碰到 在学习其他语言的时候也同样会碰到 错误1 缩进 python是强制缩进
  • GET 和 POST的区别? 用POST方法发送登陆请求

    GET 和 POST的区别 用POST方法发送登陆请求 lt 1 gt http方法 http协议定义了很多方法对应不同的资源操作 其中最常用的是GET 和 POST 方法 GET POST OPTIONS HEAD PUT DELETE
  • 什么是计算机网络中的127.0.0.1 IP地址或Localhost?

    IP addresses are used to specify the hosts in a numeric way There are different types of IP addresses in Computer networ
  • 听说渲影很便宜,是真的吗?

    这次我比较了3个平台 炫云 渲影和渲染100 首先说结论 渲影是很便宜 但也没便宜过渲染100 而且出图大小有猫腻 具体的往下看 首先我选取了一个219M的场景 不是很大 设置的分辨率是3200 4000 提交3个平台的时候选择的参数也一样
  • 《C++标准库》学习笔记 — STL — 并发 — 线程同步与并发 — mutex 与 lock

    C 标准库 学习笔记 STL 并发 线程同步与并发 mutex 与 lock 一 线程同步与并发并发问题 1 出错情况 1 未同步化的数据访问 2 写至半途的数据 3 重新安排的语句 2 解决问题需要的特性 3 C 并发的支持 二 Mute
  • C#中仿QQ截图

    欢迎大家提出意见 一起讨论 转载请标明是引用于 http blog csdn net chenyujing1234 代码 VS2008 http www rayfile com zh cn files bad4b357 978a 11e1