对于QQ截图,肯定是早就有认识了,只是一直没有去认真观察这个操作的具体实现步骤。所以这里将自己的记忆中的步骤简单的写一下:

习惯性用QQ或者TIM的人,一般是使用Ctrl+Alt+A  快捷键(热键)快速实现截图。

  1. Ctrl+Alt+A  进入截图模式
  2. 鼠标左键点击
  3. 鼠标拖动对截图去进行选取
  4. 鼠标左键弹起
  5. 双击截图区域  保存图片到剪贴板
  6. 鼠标右键点击
  7. 退出截图模式

因为考虑到截图模式的时候  一般只能显示一个窗体  所以就考虑使用单例模式  在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截图的功能及相关问题相关推荐

  1. php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

    本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能.分享给大家供大家参考,具体如下: 最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几 ...

  2. Ubuntu中类似QQ截图的截图工具并实现鼠标右键菜单截图

    文章目录 简介: 安装: 设置快捷键: 实现鼠标右键菜单截图: 简介: 在Windows中用惯了强大易用的QQ截图,会不习惯Ubuntu中的截图工具. 软件名为火焰截图,功能类似QQ截图,可以设置快捷 ...

  3. qqp2011java_腾讯开放平台中实现QQ登陆的功能

    昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议. 具体什么是OAUTH,请您GG一下吧... 关于腾讯的开放平台,最主要的就是参数一定 ...

  4. 如何在Android手机中开发QQ账户登陆功能的应用

    2019独角兽企业重金招聘Python工程师标准>>> 背景 OAUTH 开发授权协议,为用户资源的授权提供了一个安全开放而又简易的标准.可以使用第三方的账户登陆另一个方的 应用或服 ...

  5. 网页中增加QQ在线咨询的功能

    只需在body里面增加如下一行代码 <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=你的Q ...

  6. javascript在网页中实现粘贴qq截图功能

    这篇文章主要介绍了在网页中实现读取剪贴板粘贴截图功能,即可以把剪贴板的截图Ctrl+V粘贴到网页的一个输入框中,例如QQ截图.旺旺截图或者其它截图软件.具体代码如下. <!DOCTYPE HTM ...

  7. html制作qq注册页面代码截图,javascript在网页中实现粘贴qq截图功能

    这篇文章主要介绍了在网页中实现读取剪贴板粘贴截图功能,即可以把剪贴板的截图Ctrl+V粘贴到网页的一个输入框中,例如QQ截图.旺旺截图或者其它截图软件.具体代码如下. 利用 clipboardData ...

  8. 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(二)实现QQ截图功能

    本文默认你已经学习了上一篇文章,如果你还没有学习,就赶快去学习吧.关注博主,学习更多内容. 文章目录 前言 一.任务目的 要求 二.实现截图功能 1. 截图功能分析 理论依据 1. 截图功能 2. 支 ...

  9. Qt实现仿QQ截图,带绘图,撤回功能!

    Qt实现仿QQ截图 想自己用Qt做个东西玩玩,偶然间看到小猪老师做的截图文章 做的很棒,但是看到最后没有发现绘图功能,然后百度了各种用qt制作的截图软件,大部分都不带绘图功能,于是我便打算在小猪老师代 ...

最新文章

  1. 《Tensorflow实战》之6.3VGGnet学习
  2. mysql数据库帐户_MySQL数据库用户帐号管理基础知识详解
  3. mysql create table 语法详解
  4. VTK修炼之道37:图像平滑_高斯滤波器
  5. 独家 | 揭秘2021双11背后的数据库硬核科技
  6. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证
  7. 政企上云网络适配复杂,看华为云Stack有妙招
  8. linux充当防火墙,Linux下主机充当防火墙的巧妙应用之iptables
  9. 基本结构标签(HTML)
  10. Python pip下载包时候出现下载中断,超时的情况
  11. 【 Redis开发与运维】第3章 读书笔记
  12. Win10如何把D盘空间分给C盘|Win10硬盘分成多个分区
  13. 科技爱好者周刊(第 163 期):你的城市有多少张病床?
  14. Validity和setCustomVilidity
  15. 固体火箭发动机常用设计参数
  16. 【BOOST C++容器专题03】【05】Boost.CircularBuffer
  17. apr 移植android平台,omap3530移植android4.0
  18. 美光Crucial BX300 SSD评测 | 揭穿不实报道,惊不惊喜?
  19. 三级网络技术应付式速成考试笔记(汇总)
  20. matlab quiver一维矢量图,Matlab quiver函数用法 - 画矢量箭头图

热门文章

  1. 转学伯克利计算机科学,转学前往伯克利大学 你够格吗?
  2. python3比较文本差异_脑科学方向 | Python3的安装与环境搭建
  3. C++工作笔记-hiredis中关于ERR wrong number of arguments for HMSET问题的解决
  4. Java笔记-多线程协调及ReentrantLock的使用
  5. Qt文档阅读笔记-Qt工作笔记-QTableWidget::selectedItems()官方解析与实例(如何进行多选)
  6. css3自适应布局单位vw,vh你知道多少?
  7. 商务英语计算机,BEC商务英语
  8. python第一课教案_Python第一课
  9. 微信能远程控制电脑吗_神器分享:用微信就能远程控制电脑,这款神器有些厉害...
  10. ue4显示变量_UE4:快速入门蓝图(Blueprint)的方法之一