C#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能...

本文主要是介绍C#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能

虽然添加了放大镜的功能,但是在进行像素级的定位时,还是不容易精确定位,在用鼠标操作时要改变一两个像素的位置还是有些困难的。

处理键盘按下事件

        /// <summary>/// 处理键盘按下事件/// 用于实现以下功能:/// 当用户按下Esc键时,退出截图过程;/// Shift + Enter 开始截图的功能;/// 使用键盘的上下左右键调整截图位置的功能;/// Shift + 上下左右键调整截图区域大小的功能;/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Escape){ExitCutImage(true);// 如果不加这一句,热键只能在窗口隐藏后使用一次,之后就不起作用了。//RegisterHotKey(Handle, 100, 2 | 1, Keys.A);}if (e.Shift && e.KeyCode == Keys.Enter){if (!this.lbl_CutImage.Visible){this.isCuting = true;this.beginPoint = MousePosition;this.endPoint = MousePosition;SaveCutImageSize(MousePosition, MousePosition);UpdateCutInfoLabel(UpdateUIMode.ShowInfoBox | UpdateUIMode.ShowCutImage);}}if (e.KeyCode == Keys.Left){if (this.lbl_CutImage.Visible){if (e.Shift){if (this.cutImageRect.Width > 1){this.cutImageRect.Width -= 1;Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y);UpdateCutInfoLabel(UpdateUIMode.None);}}else{if (this.cutImageRect.Left > -1){this.cutImageRect.X -= 1;UpdateCutInfoLabel(UpdateUIMode.None);}}}else{if (Cursor.Position.X > -1){Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y);}}}if (e.KeyCode == Keys.Right){if (this.lbl_CutImage.Visible){if (e.Shift){if (this.cutImageRect.Right < this.Width + 1){this.cutImageRect.Width += 1;Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);UpdateCutInfoLabel(UpdateUIMode.None);}}else{if (this.cutImageRect.Right < this.Width + 1){this.cutImageRect.X += 1;UpdateCutInfoLabel(UpdateUIMode.None);}}}else{if (Cursor.Position.X < this.Width + 1){Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);}}}if (e.KeyCode == Keys.Up){if (this.lbl_CutImage.Visible){if (e.Shift){if (this.cutImageRect.Height > 1){this.cutImageRect.Height -= 1;Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - 1);UpdateCutInfoLabel(UpdateUIMode.None);}}else{if (this.cutImageRect.Top > -1){this.cutImageRect.Y -= 1;UpdateCutInfoLabel(UpdateUIMode.None);}}}else{if (Cursor.Position.Y > -1){Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - 1);}}}if (e.KeyCode == Keys.Down){if (this.lbl_CutImage.Visible){if (e.Shift){if (this.cutImageRect.Bottom < this.Height + 1){this.cutImageRect.Height += 1;Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 1);UpdateCutInfoLabel(UpdateUIMode.None);}}else{if (this.cutImageRect.Bottom < this.Height + 1){this.cutImageRect.Y += 1;UpdateCutInfoLabel(UpdateUIMode.None);}}}else{if (Cursor.Position.Y < this.Height + 1){Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 1);}}}}

处理键盘抬起事件

        /// <summary>/// 处理键盘抬起事件/// Shift + Enter 开始截图,当松开Shitf键后,/// 停止截图区域大小的设置,不然的话鼠标移动还会改变截取区域的大小;/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_KeyUp(object sender, KeyEventArgs e){if (e.KeyCode == Keys.ShiftKey){if (this.isCuting){this.isCuting = false;this.pictureBox_zoom.Hide();this.lastMouseMoveTime = 0;UpdateCutInfoLabel(UpdateUIMode.None);}}}

用键盘操作截图的功能说明:

按下截图快捷键(通常是:Ctrl + Shift + A)后,可以移动鼠标到大概的位置,然后就可以通过键盘的上下左右键精确移动鼠标的位置,在精确定位截图的位置后,就可以按下Shift 键再按 Enter键,Shift键不要松开,这时可以按上下左右键改变截图区域的大小,松开Shift键完成截图区域大小设置;

这时你可以通过上下左右键来改变截图区域的位置,按下Shift键不要松开,再按上下左右键可以改变截图区域的大小。

这篇关于C#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846307

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保