C#高仿腾讯QQ截图程序

最近把以前制作的截图程序重新写了一下 动了一个大手术 高质量仿照的TX的截图程序

源码下载1(2012-12-09)

http://download.csdn.net/detail/crystal_lz/4863320


源码下载2(2012-12-15)

http://download.csdn.net/download/crystal_lz/4889763


新改版见:http://blog.csdn.net/crystal_lz/article/details/9200859

- -!、发现bug 在文章后面更改

先看几个效果图

貌似图被和谐了

拖动过程中显示当前鼠标下一小块的图像信息 尺寸、颜色信息的  注意 这里颜色是用的ARGB 本来截图的话RGB就够了 可是我把那个做成了控件 不仅截图可用 其他地方也可用作图像的选取 具体看代码就知道了


貌似图片被和谐了

并且我还加了一个可以截图的同时把鼠标也捕获下来 现在看到的是我自己的截图程序 那个工具条啥的 是从TX的截图程序上面拔下来的


貌似图片被和谐了

上面是几个工具条上的工具的三种粗细型号的展示 看到的蓝色的粗的刷笔 本来想的不应该是这个效果的 应该是颜色填充均匀的那种 但是仔细一想代码中用的是DrawLine(P,PointLast,PointCurrent);这种方式来画的自由线条 如果是一个像素的没什么问题 粗点的就是上面看到的那种效果 也就是由许多小线段拼接出来的自由线条而每个线段两端都是方的所以线段与线段之间的接缝处 可能就有问题 反正就那个意思 你懂得  不过再仔细一想虽然不是想要的效果但却意外的出现了 蜡笔的效果 果断也就不改了这样也不错



同样的具有自动捕获窗体边框的功能


图片貌似被和谐了

使用也非常简单 这个截图的功能写到了一个dll中 引用名称空间 然后FrmCapture 就是截图的了给了他几个属性 也就是上面看到的

同时在拖动过程中可以通过键盘 wasd 四个键来控制鼠标精确移动

操作方式也和TX的一样

右键鼠标 如果有选择的区域则取消选择的区域   没有则退出截图

双击将选择的区域复制到剪切板


不过话说回来 平时聊天的时候 或许常用到截图 但是除了聊天外就很少用到截图了

大多数时候弹出 alt + ctrl + a 都不是为了截图 而是为了框选一下某一个区域的大小 或者 在屏幕上去选择一个点的颜色信息(所以我搞了 w a s d 四个键来精确移动)

所以显示坐标、尺寸、还有颜色信息的那些功能做得比较全

工具栏上面的 工具 我也就是象征性的做了一下 前面几个都还成 字体哪里就有点水了 TX的可以选择字号 而我还是只有三种选择主要是为了 和前面的公用那个调色和选择大小的那一个控件 这样就不用再搞新的东西了(我怀疑工具条上面的一些东西 对于大多数其他人来说 估计用都没有用过)

==========================分割线=======================

在上面的 源码下载2 中把自己修改的自己用的放了上来 和源码1相比 修复了已知的双击的那个bug - -!、、坑爹的发现 写到这里脑子又想起一个bug 就是 如果截图好了弹出保存对话框后 然后右键会取消截图 然后再右键截图关闭 关闭了倒好没啥 可是 弹出保存对话框后取消截图保存的时候就异常了  不过一般情况下貌似只要正常操作是不会出现这个问题了  算了一会儿还是把解决办法搞到下面 这里就说说我改了后的源码 (对了 在弹出保存对话框的时候默认是 保存bmp格式 如果不习惯把对话框索引改一下就行了)

- -!、其实也没改啥源码出了修复bug直接新建了一个工程导入dll然后写代码

貌似图片被和谐了

Oh God 突然发现窗体上面的 Other 写错了 坑爹啊 下载自己改吧、、、

这个是设置窗体可以自定义快捷键 还有是否开机自起 是否捕获鼠标(开始运行不会出现窗体 隐藏启动在托盘显示)

我一直觉得那里不对劲 终于发现了 那个最小化按钮还在 居然忘了 要么屏蔽最小化按钮(this.MinimizeBox = false;)要么直接设置成toolwindow

this.FormBorderStyle = FormBorderStyle.FixedToolWindow;

貌似图片被和谐了

注意如果要设置开机自起的话 务必确保你的程序的路径开机后能找到 也就是要保持你程序的当前路径 因为开机自启的时候 是获取的程序的当前路径然后写入注册表的

反正我是把它放到我的文档下面然后新建了一个文件夹

貌似图片被和谐了

那个dll是截图的模块 exe是那个设置的窗体 那个cfg保存的是设置的信息(默认情况下是木有滴 是要设置后生成滴)  要放哪里看个人爱好 如果你要选择自起的话



整个思路也和前面几篇文章中提到的一样 只是在代码层面上动了一个大手术 因为原来写的主要是凸显那个自动捕获窗体的功能

//根据鼠标位置找寻窗体平绘制边框
private void FoundAndDrawWindowRect() {Win32.LPPOINT pt = new Win32.LPPOINT();pt.X = MousePosition.X; pt.Y = MousePosition.Y;IntPtr hWnd = Win32.ChildWindowFromPointEx(Win32.GetDesktopWindow(), pt,Win32.CWP_SKIPINVISIBL | Win32.CWP_SKIPDISABLED);if (hWnd != IntPtr.Zero) {IntPtr hTemp = hWnd;while (true) {      //循环的根据坐标向内部找寻子窗体 直到无法找到位置Win32.ScreenToClient(hTemp, out pt);hTemp = Win32.ChildWindowFromPointEx(hTemp, pt, Win32.CWP_All);if (hTemp == IntPtr.Zero || hTemp == hWnd)break;hWnd = hTemp;pt.X = MousePosition.X; pt.Y = MousePosition.Y; //坐标还原为屏幕坐标}Win32.LPRECT rect = new Win32.LPRECT();Win32.GetWindowRect(hWnd, out rect);imageProcessBox1.SetSelectRect(new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top));}
}

同前几篇文章一样是通过禁用自身窗体然后通过ChildWindowFromPointEx函数来根据鼠标位置 获得鼠标下面的窗体 因为在获取的时候 鼠标下面是截图程序的一个窗体 所以在找寻窗体的时候得把自己忽略掉 而ChildWindowFromPointEx在查找过程中可以忽略禁用的窗体 所以讲自己禁用就到到目的了 然后通过Hook来监视鼠标的行为 来恢复禁用的窗体

private void m_MHook_MHookEvent(object sender, MHookEventArgs e) {........//鼠标点下恢复窗体禁用if (e.MButton == ButtonStatus.LeftDown || e.MButton == ButtonStatus.RightDown) {this.Enabled = true;imageProcessBox1.IsDrawOperationDot = true;}........
}

还有一点 就只捕获鼠标的时候

//获取桌面图像
private Bitmap GetScreen() {Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height);if (this.isCaptureCursor) {     //是否捕获鼠标//如果直接将捕获当的鼠标画在bmp上 光标不会反色 指针边框也很浓 也就是说//尽管bmp上绘制了图像 绘制鼠标的时候还是以黑色作为鼠标的背景 然后在将混合好的鼠标绘制到图像 会很别扭//所以 干脆直接在桌面把鼠标绘制出来再截取桌面using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) {   //传入0默认就是桌面 Win32.GetDesktopWindow()也可以Win32.PCURSORINFO pci;pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.PCURSORINFO));Win32.GetCursorInfo(out pci);if (pci.hCursor != IntPtr.Zero) {Cursor cur = new Cursor(pci.hCursor);g.CopyFromScreen(0, 0, 0, 0, bmp.Size); //在桌面绘制鼠标前 先在桌面绘制一下当前的桌面图像//如果不绘制当前桌面 那么cur.Draw的时候会是用历史桌面的快照 进行鼠标的混合 那么到时候混出现底色(测试中就是这样的)cur.Draw(g, new Rectangle((Point)((Size)MousePosition - (Size)cur.HotSpot), cur.Size));}}}//做完以上操作 才开始捕获桌面图像using (Graphics g = Graphics.FromImage(bmp)) {g.CopyFromScreen(0, 0, 0, 0, bmp.Size);}return bmp;
}

我总感觉上面的方式很别扭 可是目前我也就只能通过这种方式去捕获鼠标了

有兴趣的就自己改造吧 导入那个dll自己想咋改造就咋改造

=========================================================================

更改bug

如果在选区内部双击 会出现异常

解决办法

貌似图片被和谐了

在FrmCapture中的  mouseDown事件中 把 m_ptOriginal = e.Location 放到if外面去 这个是记录鼠标点下时候的位置的

还有

貌似图片被和谐了

mouseup中 加上这一句 如果与点下的时候的坐标一样啥都不做

好吧 就算上面的这样还是有问题 是用画刷工具的时候 就有问题了 因为画刷的m_ptOriginal在mousemove中不停的给他赋值 

而且 逻辑还有点问题 鼠标抬起只要在绘制状态下无论如何都要 把m_isStartDraw赋值成false 和 Cursor.Clip 也要清空

那个return只是决定是否 SetLayer 将图层绘制上去而已

所以

if (!m_isStartDraw) return;
Cursor.Clip = Rectangle.Empty;
m_isStartDraw = false;
if (e.Location == m_ptOriginal && !tBtn_Brush.IsSelected) return;
this.SetLayer();        //将绘制的图形绘制到历史图层中
顺序这样放置

这样都还有问题 还是出在画刷上 所以在下面的SetLayer()方法前面加一句 if(this.IsDisposed) return;如果窗体都关闭了就 不执行操作 解释看下面、、

再解释一下为什么在选取类双击会出问题 因为在选区内做鼠标的一些操作的时候 mousedown 和 up 都会根据情况执行一些代码

然后双击事件众所周知 是两个单击 而单击是 mousedown 和 mouseup的组合 所以 doubleclick 的时候会分别执行两次 mousedown 和 mouseup 不过双击这个过程中顺序是这样的

mousedown - mouseup - mousedown - doubleclick - mouseup

双击事件 会在最后一个mouseup之前执行  而我却在双击中把图拷贝到剪切板 然后就关闭窗体了 所以 之后执行的mouseup的时候 调用函数的时候 就有问题 因为一些资源被我释放了

顺便再说一个

图片貌似被和谐了

在FrmCapture中的InitMember里面加上上面三条

之所以这样 是可能会出现在不同电脑上 运行出来 工具条的大小什么的会有些错位

尤其是panel1 因为panel1里面放的button是自定义的 而button的大小也是用户不能控制的

我对自定义的那个button 搞23 是固定的 宽至少23 (也就是没有文本显示只有图)  如果在有文本的情况下 比如最后 一个是 finish 那么button的宽自动根据文本的宽度啥的自动调整大小

所以在不同电脑上 字体啥的可能不一样 所以 自定义的button的大小也可能不一样 所以用上面三条代码来控制两个panel的大小 

在截图后 然后点击保存出现保存对话框的时候 还可以右键取消截图选取 

(- -!、、虽然保存对话框是模态对话框 hook无法可挡..)虽然正常情况不会出现这个情况 不过还是说一下

解决办法

再搞一个全局变量 m_bSave然后在 保存的那个按钮的事件函数里面

private void tBtn_Save_Click(object sender, EventArgs e) {m_bSave = true;    //进入的时候设置成true...m_bSave = false;   //结束的时候设置成false
}
然后在 m_MHook_MHookEvent 事件中的 右键抬起 部分

#region 右键抬起if (e.MButton == ButtonStatus.RightUp) {if (!imageProcessBox1.IsDrawed) //没有绘制那么退出(直接this.Close右键将传递到下面)this.BeginInvoke(new MethodInvoker(() => this.Close()));if (m_bSave) return;    //如果正在保存 不执行下面的代码......
}#endregion



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353496.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【2022-10-19】让Mac QQ自带截图软件单独运行 / 节省大量系统内存 / 快捷截图 / ScreenCapture QQ/ QQ jietu plugin

相信用过Window QQ自带的截图工具的朋友,都会说一句:”真TM好用!“,同样Mac QQ也自带了这样一款截图工具,但肯定没Window下这么好用,但是在Mac上应该也是数一数二的,我看了下界面,跟…

QQ截图工具截取

邮箱截图插件 TXGYMailCamera.dll(X86) Export: CameraWindow CameraSubArea CameraWindowLikeSpy 调用参数: rundll32 TXGYMailCamera.dll CameraWindow 微信截图插件 PrScrn.dll(X86) Export: PrScrn 调用参数: rundll32 PrScrn.dll PrScrn 下载地址&…

QQ自带截图功能(你想不到的强大, 必看,长截图/翻译/文本识别/钉在桌面/录屏)

本文是众多使用技巧中其中的一篇, 全部使用技巧点击链接查看, 保证你收获满满 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文可以转载,但请注明来处&#x…

c盘清理软件:清理垃圾、扩大c盘和系统迁移

一、为什么要c盘清理软件 Windows系统采用了NTFS文件系统,这种文件系统特点是有文件碎片和系统产生的临时文件会大量存储到系统盘上,而且在使用电脑的过程中,由于程序的安装、升级、卸载和其他操作会产生大量无用的垃圾文件,这些…

经典好用的软件,不容错过,建议收藏

一、火绒安全软件 之前连这个良心杀毒安全软件都不知道。成立于2011年,一直很低调,很多人都不知道,但真的是良心软件。具有杀毒、防火墙、主动防御三大功能。干净、轻便且功能厉害。同时还有家长模式,控制上网时间、网站、软件等…

算法的深层次知识是数学,这些常用的互联网经典算法应用案例,你知道几个?

前言 在文章初始,我们来思考一个很有意思的问题:一滴水从很高很高的空中自由落体下来,会不会砸伤人? 能够砸伤人则需要水滴具有的动能,即公式(1/2)mv^2,而水滴的质量是一定的&#…

JS和H5做一个音乐播放器,附带源码

http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1、首页 2、底部播放控件 3、播放页面 4、播放列表 5、排行榜 6、音乐搜索 输入搜索关键词,点击放大镜图标 7、侧边栏 目录结构 开发心得与总结 1、轮播图 首先感谢作者ShanaMaid/…

Video Editor MovieMator Pro for Mac(视频编辑大师专业版)

Video Editor MovieMator Pro Mac版是一款功能齐全的Mac视频编辑器,可在几分钟内创建专业品质的视频。它提供了基本的编辑功能,如修剪,裁剪,分割,旋转等。此外,作为Mac视频编辑器, MovieMator P…

求大师点化,寻求大文件(最大20G左右)上传方案

之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需求,都能得到…

一键智能切割(分割)整轨wav、flac、ape音乐文件

几乎所有的音乐分割软件,都需通过人工试听来确定每一首音乐的断点(起始时间点、结束时间点),且只支持mp3、wav两种格式,非常不便,切割音乐需耗费大量时间。 dts音效大师的音乐切割功能,既保留了…

Linux--ServerProgramming--(4)详解 I/O复用

1. I/O 复用功能 I/O 复用能同时监听多个文件描述符。 I/O 复用本身是阻塞的。 当有多个文件描述符同时就绪时:若不采取额外措施,程序就只能按顺序一次处理其中的每一个文件描述符,这使得服务器程序看起来是串行工作的。若要实现并发&#…

【OpenMMLab AI实战营第二期】深度学习预训练与MMPretrain

深度学习预训练与MMPretrain MMPreTrain 算法库介绍 MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup,并开发…

Selenium浏览器自动化怎么上传文件

Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展,文件上传的方式越来越多样。而有一些文件上传的控件,要做自动化控制会更复杂一些,这篇文章主要讨论在复杂情况下,如何通过自动化完成文件上传。 1. input 元素上传…

如何判断电脑已感染“磁碟机”病毒?

1. 某些常用安全软件打不开,打开后立即被关闭,或者打开后有被“分尸”的现象,这是由于病毒不断向这些软件发送垃圾消息导致他们不能响应正常的用户指令导致。 2. 安全模式被破坏。用户试图进入安全模式时,显示的…

盘点IT史上最牛的三大病毒

2019独角兽企业重金招聘Python工程师标准>>> 磁碟机】——史上最牛的木马运输机 目前结局:消声匿迹。是避风头还是气数已尽?磁碟机病毒作者仿佛比熊猫烧香作者更聪明一些,面对网民的骂声一片,面对各大反病毒厂商的联合…

如何完美清除被磁碟机感染的文件?

经过我N种杀毒软件2天时间的测试,唯有江民杀毒软件可以完美清除被磁碟机感染的文件,清除后文件CRC32与原未感染文件CRC32完全相同。 以下是比较报告: File: E:/磁碟机病毒样本/原未感染文件/Wlisten.exe Size: 53760 bytes File Version: 4.1…

360安全卫士大战“病毒之王”——最新磁碟机变种

ps: 前天,一朋友的电脑也是这种情况,任何的杀软都不能打开,一打开就是找不到文件,没油办法打开,我拿到电脑后首先安装了江民2008(丁香鱼提供),能够启动,并且查杀了几个病…

遗补:“预防‘磁碟机’病毒”

就在我写完“预防‘磁碟机’病毒”的第三天,我的同事张哥就发现我做出来的防毒文件夹有一个问题。这个问题就是在正常情况下这些文件夹的文件名是可以修改的。拿Autorun.inf这个文件夹来说吧,里面的“AnitVirus.”这个文件夹是既打不开,以不可…

windows11安装docker desktop实现docker环境

简介 我们知道docker的安装一般我们是安装在linux系统上的,但是如果你的宿主机是windows,那么你还想装docker,那么就需要现在你的windows上装上虚拟机,虚拟机上装linux操作系统,然后在Linux操作系统上再去安装docker&…

磁碟机病毒***猖獗教你应对方法

转自: 技术频道 [url]http://technic.txwm.com/[/url] 磁碟机***最近成为安全领域的热门话题,据悉,进入3月以来,“磁碟机”***作者已经更新了数次,感染率和破坏力正逐步提高。 磁碟机***介绍:“磁碟机”***…