C#中实现QQ截图的功能及相关问题
对于QQ截图,肯定是早就有认识了,只是一直没有去认真观察这个操作的具体实现步骤。所以这里将自己的记忆中的步骤简单的写一下:
习惯性用QQ或者TIM的人,一般是使用Ctrl+Alt+A 快捷键(热键)快速实现截图。
- Ctrl+Alt+A 进入截图模式
- 鼠标左键点击
- 鼠标拖动对截图去进行选取
- 鼠标左键弹起
- 双击截图区域 保存图片到剪贴板
- 鼠标右键点击
- 退出截图模式
因为考虑到截图模式的时候 一般只能显示一个窗体 所以就考虑使用单例模式 在ScreenBody窗体中实现以下代码
1:创建单例
private static ScreenBody screenBody=null;
2:私有化构造函数
private ScreenBody() { InitializeComponent(); }
3:创建静态方法
private static ScreenBody GetSingle() { if(screenBody==null) { screenBody=new ScreenBody(); } return screenBody; }
进一步讨论一下在Main窗体中的调用 Main中添加了一个button 命名为btnCutter
private void btnCutter_Click(object sender,EventArgs e) {//新建一个和屏幕大小相同的图片img 也可以用BitMap image img=new Bitmap(Screen.AllScreens[0].Bounds.Width,Screen.AllScreens[0].Bounds.Height); //创建一个画板 让我们可以在画板上画图 大小和屏幕大小一样大 Graphics g=Graphics.FromImage(img);//将屏幕图片拷贝到空白图片img g.CopyFromScreen(new Point(0,0),new Point(0,0),Screen.AllScreens[0].Bounds.Size); //创建截图窗体 ScreenBody body=ScreenBody.GetSingle(); //指示窗体的背景图片为屏幕图片 body.BackGroundImage=img; body.ShowDialog();}
对于窗体ScreenBody
声明全局变量
private bool CatchStart;//判断鼠标是否按下private bool CatchFinished;//判断矩形是否绘制完成private Point DownPoint;//鼠标按下的点private Image baseMap;//最基本的图片private Rectangle CatchRectangle;
必须要实现的那几个事件
- 鼠标按下MouseDown
private void ScreenBody_MouseDown(object sender, MouseEventArgs e){//鼠标左键按下就是开始画图,也就是截图if (e.Button == MouseButtons.Left){if (CatchStart == false){CatchStart = true;//保存此时的坐标DownPoint = new Point(e.X, e.Y);}}}
鼠标移动 MouseMove
private void ScreenBody_MouseMove(object sender, MouseEventArgs e){//确保截图开始if (CatchStart){//新建一个图片,让它与屏幕图片相同Bitmap copyBmp = (Bitmap)baseMap.Clone();//鼠标按下时的坐标Point newPoint = new Point(DownPoint.X, DownPoint.Y);//新建画板和画笔Graphics g = Graphics.FromImage(copyBmp);Pen p = new Pen(Color.Azure, 1);//画笔的颜色为azure 宽度为1//获取矩形的长度 int width = Math.Abs(e.X - DownPoint.Y);int height = Math.Abs(e.Y - DownPoint.Y);if (e.X < DownPoint.X){newPoint.X = e.X;}if (e.Y < DownPoint.Y){newPoint.Y = e.Y;}CatchRectangle = new Rectangle(newPoint, new Size(width, height));g.DrawRectangle(p, CatchRectangle);//释放目前的画板 g.Dispose();p.Dispose();//从当前窗体创建新的画板Graphics g1 = this.CreateGraphics();//将刚刚所画的图片画到截图窗体上去//为什么不直接在当前窗体画图呢???//如果直接解决将矩形画在窗体上,会造成图片抖动而且有多个矩形//这样实现也属于二次缓冲技术g1.DrawImage(copyBmp, new Point(0, 0));g1.Dispose();//释放拷贝图片 防止内存被大量的消耗 copyBmp.Dispose();}
鼠标弹起 Mouseup
/// <summary>/// 鼠标左键弹起事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ScreenBody_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){//如果截图已经开始,鼠标左键弹起设置截图完成if (CatchStart){CatchStart = false;CatchFinished = true;}}}
鼠标双击
private void ScreenBody_MouseDoubleClick(object sender, MouseEventArgs e){if (e.Button==MouseButtons.Left&&CatchFinished){//新建一个矩形大小相同的空白图片Bitmap CatcheBmp = new Bitmap(CatchRectangle.Width, CatchRectangle.Height);Graphics g = Graphics.FromImage(CatcheBmp); ;//把basemap中指定的部分按照指定大小画到空白图片上//CatchRectangle指定的baseMap中指定的部分//第二个参数指定绘制到空白图片的位置和大小//画完后CatchedBmp不再是空白图片,而是具有与截取的图片一样的内容g.DrawImage(baseMap, new Rectangle(0, 0, CatchRectangle.Width, CatchRectangle.Height));//将图片保存到剪切板中 Clipboard.SetImage(CatcheBmp);g.Dispose();CatchFinished = false;this.BackgroundImage = baseMap;CatcheBmp.Dispose();this.DialogResult = DialogResult.OK;this.Close();}}
鼠标右键 退出截图
/// <summary>/// 鼠标右键点击结束截图/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ScreenBody_MouseClick(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Right){this.DialogResult = DialogResult.OK;this.Close();}}
最复杂的热键注册 自己也是去网上看的 Main窗体中
- 声明枚举
[FlagsAttribute]public enum KeyModifiers{None = 0,Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8}
然后在类中编辑一下代码
//在C#中引用命名空间System.Runtime.InteropServices;来加载非托管类user32.dll/** RegisterHotKey函数原型及说明:* BOOL RegisterHotKey(* HWND hWnd, // window to receive hot-key notification* int id, // identifier of hot key* UINT fsModifiers, // key-modifier flags* UINT vk // virtual-key code);* 参数 id为你自己定义的一个ID值* 对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,十进制为0~49151* 对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,十进制为49152~65535* 在同一进程内该值必须唯一参数 fsModifiers指明与热键联合使用按键* 可取值为:MOD_ALT MOD_CONTROL MOD_WIN MOD_SHIFT参数,或数字0为无,1为Alt,2为Control,4为Shift,8为Windows* vk指明热键的虚拟键码*/[System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数public static extern bool RegisterHotKey(IntPtr hWnd, // handle to windowint id, // hot key identifieruint fsModifiers, // key-modifier optionsKeys vk // virtual-key code );[System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数public static extern bool UnregisterHotKey(IntPtr hWnd, // handle to windowint id // hot key identifier);
再接着
private void Form1_Load(object sender, EventArgs e){uint ctrlHotKey = (uint)(KeyModifiers.Alt | KeyModifiers.Ctrl);// 注册热键为Alt+Ctrl+C, "100"为唯一标识热键RegisterHotKey(Handle, 100, ctrlHotKey, Keys.A);}//热键按下执行的方法private void GlobalKeyProcess(){this.WindowState = FormWindowState.Minimized;//窗口最小化需要一定的时间 使用线程Thread.Sleep(200);btnCutter.PerformClick();}protected override void WndProc(ref Message m){//如果m.Msg的值为0x0312那么表示用户按下了热键const int WM_HOTKEY = 0x0312;switch (m.Msg){case WM_HOTKEY:if (m.WParam.ToString()=="100"){GlobalKeyProcess();}break;default:break;}base.WndProc(ref m);}private void Form1_FormClosing(object sender, FormClosingEventArgs e){// 卸载热键UnregisterHotKey(Handle, 100);}
热键的功能就能实现。但是我遇到了很多问题 首先是basemap 没有初始化值
- 这些问题 还有待解决!!!
转载于:https://www.cnblogs.com/Audient/p/7684922.html
C#中实现QQ截图的功能及相关问题相关推荐
- php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能
本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能.分享给大家供大家参考,具体如下: 最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几 ...
- Ubuntu中类似QQ截图的截图工具并实现鼠标右键菜单截图
文章目录 简介: 安装: 设置快捷键: 实现鼠标右键菜单截图: 简介: 在Windows中用惯了强大易用的QQ截图,会不习惯Ubuntu中的截图工具. 软件名为火焰截图,功能类似QQ截图,可以设置快捷 ...
- qqp2011java_腾讯开放平台中实现QQ登陆的功能
昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议. 具体什么是OAUTH,请您GG一下吧... 关于腾讯的开放平台,最主要的就是参数一定 ...
- 如何在Android手机中开发QQ账户登陆功能的应用
2019独角兽企业重金招聘Python工程师标准>>> 背景 OAUTH 开发授权协议,为用户资源的授权提供了一个安全开放而又简易的标准.可以使用第三方的账户登陆另一个方的 应用或服 ...
- 网页中增加QQ在线咨询的功能
只需在body里面增加如下一行代码 <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=你的Q ...
- javascript在网页中实现粘贴qq截图功能
这篇文章主要介绍了在网页中实现读取剪贴板粘贴截图功能,即可以把剪贴板的截图Ctrl+V粘贴到网页的一个输入框中,例如QQ截图.旺旺截图或者其它截图软件.具体代码如下. <!DOCTYPE HTM ...
- html制作qq注册页面代码截图,javascript在网页中实现粘贴qq截图功能
这篇文章主要介绍了在网页中实现读取剪贴板粘贴截图功能,即可以把剪贴板的截图Ctrl+V粘贴到网页的一个输入框中,例如QQ截图.旺旺截图或者其它截图软件.具体代码如下. 利用 clipboardData ...
- 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(二)实现QQ截图功能
本文默认你已经学习了上一篇文章,如果你还没有学习,就赶快去学习吧.关注博主,学习更多内容. 文章目录 前言 一.任务目的 要求 二.实现截图功能 1. 截图功能分析 理论依据 1. 截图功能 2. 支 ...
- Qt实现仿QQ截图,带绘图,撤回功能!
Qt实现仿QQ截图 想自己用Qt做个东西玩玩,偶然间看到小猪老师做的截图文章 做的很棒,但是看到最后没有发现绘图功能,然后百度了各种用qt制作的截图软件,大部分都不带绘图功能,于是我便打算在小猪老师代 ...
最新文章
- 《Tensorflow实战》之6.3VGGnet学习
- mysql数据库帐户_MySQL数据库用户帐号管理基础知识详解
- mysql create table 语法详解
- VTK修炼之道37:图像平滑_高斯滤波器
- 独家 | 揭秘2021双11背后的数据库硬核科技
- 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证
- 政企上云网络适配复杂,看华为云Stack有妙招
- linux充当防火墙,Linux下主机充当防火墙的巧妙应用之iptables
- 基本结构标签(HTML)
- Python pip下载包时候出现下载中断,超时的情况
- 【 Redis开发与运维】第3章 读书笔记
- Win10如何把D盘空间分给C盘|Win10硬盘分成多个分区
- 科技爱好者周刊(第 163 期):你的城市有多少张病床?
- Validity和setCustomVilidity
- 固体火箭发动机常用设计参数
- 【BOOST C++容器专题03】【05】Boost.CircularBuffer
- apr 移植android平台,omap3530移植android4.0
- 美光Crucial BX300 SSD评测 | 揭穿不实报道,惊不惊喜?
- 三级网络技术应付式速成考试笔记(汇总)
- matlab quiver一维矢量图,Matlab quiver函数用法 - 画矢量箭头图
热门文章
- 转学伯克利计算机科学,转学前往伯克利大学 你够格吗?
- python3比较文本差异_脑科学方向 | Python3的安装与环境搭建
- C++工作笔记-hiredis中关于ERR wrong number of arguments for HMSET问题的解决
- Java笔记-多线程协调及ReentrantLock的使用
- Qt文档阅读笔记-Qt工作笔记-QTableWidget::selectedItems()官方解析与实例(如何进行多选)
- css3自适应布局单位vw,vh你知道多少?
- 商务英语计算机,BEC商务英语
- python第一课教案_Python第一课
- 微信能远程控制电脑吗_神器分享:用微信就能远程控制电脑,这款神器有些厉害...
- ue4显示变量_UE4:快速入门蓝图(Blueprint)的方法之一