本文是讲述使用C# WPF制作仿QQ截图工具的方法。

1. 注册快捷键

QQ的截图工具,当我们按下Ctrl + Alt + A键的时候就可以激活截图程序。

首先第一步就是要注册快捷键。这里需要引用到“user32.dll”。对于Win32的API,调用起来还是需要dllimport的。

我们声明一个Hotkey类,导入相应的方法。

    class HotKey{//调用WIN32的API[DllImport("user32.dll", SetLastError = true)]//声明注册快捷键方法,方法实体dll中。参数为窗口句柄,快捷键自定义ID,Ctrl,Shift等功能键,其他按键。public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);[DllImport("user32.dll", SetLastError = true)]//注销快捷键方法的声明。public static extern bool UnregisterHotKey(IntPtr hWnd, int id);}

在程序开始,Windows_Loaded方法中就要对快捷键进行注册。

方法是首先获取窗口句柄。可能C#的程序员对于句柄这个概念比较陌生,因为语言的高度封装。但是因为我们调用的是Win32的方法,还是要自己一步一步去做的。

然后再注册表中注册一个键值,添加hook监听窗口事件。通过重写winproc,相应键盘快捷键。

这一部分都是Win32程序设计的内容。

/// <summary>
/// 窗体建立完成时调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{Handle = new WindowInteropHelper(this).Handle;  //获取窗口句柄RunHotKey();  //注册并监听HotKey
}/// <summary>
/// 添加快捷键监听
/// </summary>
private void RunHotKey()
{RegisterHotKey();  //注册截图快捷键HwndSource source = HwndSource.FromHwnd(Handle);if (source != null)source.AddHook(WndProc);  //添加Hook,监听窗口事件
}/// <summary>
/// 注册快捷键
/// </summary>
private void RegisterHotKey()
{//101为快捷键自定义ID,0x0002为Ctrl键, 0x0001为Alt键,或运算符|表同时按住两个键有效,0x41为A键。bool isRegistered = HotKey.RegisterHotKey(Handle, 101, (0x0002 | 0x0001), 0x41);if (isRegistered == false){System.Windows.MessageBox.Show("截图快捷键Ctrl+Alt+A被占用", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);}
}/// <summary>
/// 重写WndProc函数,类型为虚保护,响应窗体消息事件
/// </summary>
/// <param name="hwnd"></param>
/// <param name="msg">消息内容</param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <param name="handled">是否相应完成</param>
/// <returns></returns>
protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{switch (msg){//0x0312表示事件消息为按下快捷键case 0x0312:CatchScreen();break;}return IntPtr.Zero;
}

2. 程序思路

当我们使用QQ截图时,一开始会有一个灰色的遮罩,然后鼠标按下后移动,建立选区,选区中遮罩消失并可以拖动选区。

为了实现这一功能,我们在设置遮罩时可以考虑如下方法:

首先拷贝当前屏幕作为底层。定义4个遮罩层,当鼠标按下后,捕捉鼠标移动的位置,实时调整遮罩区的大小和位置。

选取就是没有遮罩而露出底层的部分。

3. 初始化遮罩

我制作的时候遮罩和底层都使用的是Canvas。

初始化时,将整个屏幕拷贝到底层,添加黑色遮罩。

/// <summary>
/// 获取本机分辨率
/// </summary>
private void GetScreenSize()
{Width = SystemParameters.PrimaryScreenWidth;Height = SystemParameters.PrimaryScreenHeight;
}/// <summary>
/// 初始化截图,截取把整个屏幕并显示
/// </summary>
private void InitializeImage()
{GetScreenSize();image = new Bitmap(Convert.ToInt32(Width), Convert.ToInt32(Height));  //设置截图区域大小为整个屏幕using (Graphics g = Graphics.FromImage(image)){g.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(Convert.ToInt32(Width), Convert.ToInt32(Height)));  //复制当前屏幕到画板上,即将截屏图片的内容设置为当前屏幕}BitmapSource bimage = BitmapToBitmapSource(image);ImageBrush b = new ImageBrush();b.ImageSource = bimage;b.Stretch = Stretch.None;this.Background = b;  //将截屏设为背景mask.Height = Height;mask.Width = Width;InitializeMask();  //添加黑色遮罩CompositionTarget.Rendering += UpdateSelection;  //注册窗体重绘事件
}

上方的代码中涉及到了一个Bitmap与BitmapSource的转化,因为在WPF程序中控件只能用BitmapSource,所以会比较麻烦,如果是做WInform则直接使用Bitmap。

添加黑色遮罩的代码在此略去,就是在底层Canva中添加4个Canva作为遮罩层。

4. 鼠标动作捕捉

截图中涉及到的鼠标动作为:鼠标按下表示开始截图,按下后拖动表示改变选区,鼠标放开表示完成截图,完成截图后鼠标按下拖动选区,在选取边缘按下鼠标后移动缩放选区。

对于这些事件,只需要对于底层Canvas的MouseLeftButtonDown,MouseMove和MouseLeftButtonUp事件进行处理即可。处理时记录状态是正在截图还是截图完成后调整大小。

对于这些事件的处理就只是根据当前鼠标位置改变4个Canvas遮罩区的大小,代码省略。

5.选区框的制作

设计如下图所示的选取框的方法:


鼠标按下时记录起始位置,鼠标放开记录终止位置。根据这两个位置可以确定一个矩形,即上图中的选区。矩形有4个顶点和边的4个中点处分别画小矩形(System.Windows.Shapes.Rectangle)。记录矩形的中间位置。设定鼠标移动到特定位置时光标的图案。

6. 保存图片

根据选区位置,直接切割底层显示的原始图片,获取截图,然后保存。这一部分没什么说的,直接看代码。

/// <summary>
/// 保存图片
/// </summary>
private void SaveImage()
{//用当前时间作为文件名string time = DateTime.Now.ToString();//去除时间中的非法字符string filename = "截图";foreach (char symbol in time){if (symbol != '/' && symbol != ':' && symbol != ' ')filename += symbol;}if (StartPoint == FinalPoint){System.Windows.MessageBox.Show("未选择任何像素", "错误", MessageBoxButton.OK, MessageBoxImage.Error);return;}GetImage();SaveFileDialog f = new SaveFileDialog();f.Filter = "位图格式(*.bmp)|*.bmp|增强型图元文件(*.wmf)|*.wmf|可交换图像文件(*.exif)|*.exif|图形交换格式(*.gif)|*.gif|Windows图标图像格式(*.ico)|*.ico|联合图像专家组(*.jpeg)|*.jpeg|W3C可移植网络图形(*.png)|*.png|标记图像文件格式(*.tiff)|*.tiff|Windows图元文件(*.wmf)|*.wmf";f.FilterIndex = 6;f.RestoreDirectory = true;f.FileName = filename;f.Title = "保存截图";System.Windows.Forms.DialogResult b = f.ShowDialog();if (b == System.Windows.Forms.DialogResult.OK){switch (f.FilterIndex){case 1:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Bmp);break;case 2:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Emf);break;case 3:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Exif);break;case 4:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Gif);break;case 5:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Icon);break;case 6:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);break;case 7:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Png);break;case 8:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Tiff);break;case 9:bimage.Save(f.FileName, System.Drawing.Imaging.ImageFormat.Wmf);break;}System.Windows.MessageBox.Show("截图已保存", "保存成功", MessageBoxButton.OK);}
}private Bitmap bimage;
/// <summary>
/// 切分并获取选中部分截图
/// </summary>
private void GetImage()
{bimage = new Bitmap(Convert.ToInt32(FinalPoint.X - StartPoint.X), Convert.ToInt32(FinalPoint.Y - StartPoint.Y));using (Graphics g = Graphics.FromImage(bimage)){g.DrawImage(image, new System.Drawing.Rectangle(0, 0, Convert.ToInt32(FinalPoint.X - StartPoint.X), Convert.ToInt32(FinalPoint.Y - StartPoint.Y)), new System.Drawing.Rectangle(Convert.ToInt32(StartPoint.X), Convert.ToInt32(StartPoint.Y), Convert.ToInt32(FinalPoint.X - StartPoint.X), Convert.ToInt32(FinalPoint.Y - StartPoint.Y)), GraphicsUnit.Pixel);System.Windows.Forms.Clipboard.SetImage(bimage);}
}

C#WPF制作仿QQ截图工具相关推荐

  1. 视频教程-C# 实战项目——制作仿QQ软件-C#

    C# 实战项目--制作仿QQ软件 专注编程领域,拥有多年开发经验 王小科 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ...

  2. Qt仿QQ截图最新版本,放大镜、坐标、颜色复制、画图形、文字、箭头、马赛克、序号都有,支持颜色面板,支持拖动和修改,支持撤销、钉住、屏幕录制

    史上最完整的QQ截图工具,1比1,高仿供学习,MulanPSL-2.0协议,Qt实现,可移植国产系统UOS/麒麟. 仿最新版QQ截图工具,功能完善. 文章目录 功能 效果 源码 使用 功能 支持窗口自 ...

  3. 2020年7月win32 C\C++ API 写的仿QQ截图功能

    2020年7月win32 C\C++ API 写的仿QQ截图功能 近日,经常用到截图,但是没有QQ没有微信 的电脑上,截图非常不方便,起初打算网上随便找个类似的就算了,但是找了一下午,发现都是些很基础 ...

  4. java仿QQ截图带窗体检测

    最近用java GUI的swing实现了一个仿QQ截图小工具,实现了最基本的系统热键启动截图,鼠标拖动画出截图区域,或者直接窗口检测,然后保存或者复制到系统剪切板等功能.效果如图所示: 代码都放在一个 ...

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

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

  6. 打造最好用的离线QQ截图工具 C#

    截图是最经常用的工具,QQ截图是我见过最好的截图工具,只是你必须打开QQ才可以使用,有时候没法上网,或者不想上QQ的时候,截图还是很麻烦.Windows自带的那个截图工具和QQ的截图工具相差甚远.所以 ...

  7. 没上网也能使用QQ截图工具

    第一步:打开QQ的安装目录,如"C:Program FilesTencentQQ",找到QQ的安装目录下的Camera.dll文件,这个文件就是与QQ截图有关的文件.将其复制到&q ...

  8. QQ截图工具在win10放大的问题

    文章目录 文章参考 问题描述 解决办法 文章参考 最新Win10系统使用FSCapture截图屏幕变大 问题描述 截图是常用的功能,在使用win10的时候,发现以前常用的QQ截图工具每次截图的时候,就 ...

  9. Java+Swing+mysql仿QQ聊天工具

    Java+Swing+mysql仿QQ聊天工具 一.系统介绍 二.功能展示 1.用户登陆 2.好友列表 3.好友聊天 4.服务器日志 三.系统实现 四.其它 1.其他系统实现 2.获取源码 一.系统介 ...

  10. C#\WPF高仿QQ音乐V12.8界面篇《2》

    动态效果图 获取源码 通过关注个人公众号:BigBearIT,如下 通过后台回复关键词:WPF高仿QQ音乐源码 即可获得源码下载地址. 后续版本更新后会在公众号通知 /**************** ...

最新文章

  1. WUTOJ 1284: Gold Medal(Java)
  2. POE以太网交换机产品优势介绍
  3. android adb杀死服务,Android app是如何杀掉的
  4. Python 使用requests发送POST请求
  5. 忘却的旋律java2_[17-8-10]【复杂问题】打不开游戏
  6. java bank项目答案_Bank项目-java
  7. 代理模式(动态代理模式)
  8. 2017.12.7 URAT 串口通信
  9. 架构设计 —— 性能选型、高可用
  10. ArcView GIS 应用与开发技术(7)- 空间查询
  11. 如何安装 Simscape Multibody Link
  12. jpeg格式转pdf格式的简单方法
  13. SmartBI入门(二)配置SmartBI
  14. 产业安全专家谈丨数字经济高速发展,数据要素安全该如何保障?
  15. Win+R命令之后的新世界
  16. C语言递归解决水洼问题
  17. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数
  18. 金誉半导体笔记:什么是MCU单片机的SPI、UART、I2C通讯接口
  19. 共享汽车一种新型的交通方式
  20. 读《深陷平庸的SaaS如何自救?》有感

热门文章

  1. WinCE下Touch Panel驱动介绍 .
  2. ADS学习:谐波分析和参数扫描
  3. 【环球产品探寻 2】第一款纯云端增强现实(AR)平台 - 以色列
  4. 移动通信技术的未来发展趋势分析
  5. W5500以太网控制器芯片(一):ioLibrary库实现TCP服务器
  6. 大学生旅游风景主题dreamweaver网页设计大作业-陕西渭南HTML+CSS制作网页
  7. 我的项目经验v3.0
  8. mybatis 使用简单的增删查改
  9. 百度收购YY:第三次直播大战开启
  10. Oracle11g客户端client的下载与安装