章文件夹

尽管加入了放大镜的功能,可是在进行像素级的定位时,还是不easy精确定位,在用鼠标操作时要改变一两个像素的位置还是有些困难的。

处理键盘按下事件

        /// <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#软件开发实例.个人定制自己的屏幕抓图工具(八)加入了截图功能键盘的更多相关文章

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

    上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(六)加入配置管理功能 因为截图时可能须要精确截取某一部分,所以须要放大镜的功能,这样截取的时候才更easy定位截图的位置. 加入PictureBo ...

  2. C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自己定义光标,QQ截图时的光标

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  3. Java Native Interface 基于JNI的嵌入式手机软件开发实例

    1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...

  4. 【网络爬虫】【python】网络爬虫(二):网易微博爬虫软件开发实例(附软件源码)

    对于urllib2的学习,这里先推荐一个教程<IronPython In Action>,上面有很多简明例子,并且也有很详尽的原理解释:http://www.voidspace.org.u ...

  5. C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状

    本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...

  6. SNF软件开发机器人产品白皮书

    软件开发机器人 产品白皮书 使用说明书 模块名称:软件开发机器人 模块编号:12 项目负责人:王金斗 所属部门:技术中心 文档编制: 编制日期:2018-02-02 文档审核:王金斗 审核日期: 文档 ...

  7. 华为软件开发云(DevCloud):免费可商用的项目管理工具

    在软件开发技术和理念层出不穷的今天,如何更快的适应变化的环境,更好的满足客户的需求,已经成为决定从小到大各种规模企业能否活下去的关键. 天下武功唯快不破,在当今大环境中更是如此,微服务,敏捷开发,新的 ...

  8. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  9. 敏捷软件开发_实例2<四>

    敏捷软件开发_实例2 上一章中对薪水支付案例的用例和类做了详细的阐述,在本篇会介绍薪水支付案例包的划分和数据库,UI的设计. 包的划分 一个错误包的划分 为什么这个包是错误的: 如果对classifi ...

随机推荐

  1. SE 2014年5月8日

    两企业接入到 Internet(A公司和B公司),企业内部的用户及服务器均能够访问到 Internet. 2. A公司规模较大,采用了接入层/汇聚层/核心层的划分模式,接入层划分了多vLan(如图), ...

  2. 微通道对接ERP、CRM、OA、HR、SCM、PLM和其他管理系统解决方案

    公司现有ERP.CRM.OA.HR.SCM.PLM等管理系统的对接微信公共平台服务 方法1:开放接口 企业开放现有系统数据接口给第三方,或由第三方开发数据接口对接微信公众平台 方法2:获取数据库 企业 ...

  3. 关于split与StringTokenizer的理解

    关于split与StringTokenizer的理解 一.split    依据匹配给定的正則表達式来拆分此字符串.此方法返回的数组包括此字符串的子字符串,每一个子字符串都由还有一个匹配给定表达式的子 ...

  4. CentOS修改yum更新源

    1. 在修改前先备份该文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 修改更新源配置文 ...

  5. php中页面跳转部分方法论述

    假设当前页面:http://localhost:80/index.php 1.include echo “include t1.php”; 跳转后,url地址栏http://localhost:80/ ...

  6. 六:Java之集合

    集合包括的内容非常多,我发现一个非常好的博客,感觉自己都没有写的必要了! 链接献上  Java集合

  7. Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)

    今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1)        磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...

  8. 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库

    提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------  正 文 ...

  9. Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

    原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...

  10. 大并发连接的oracle在Linux下内存不足的问题的分析(转)

    最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库的SGA设置为20G,当运行业务时,一个业务高峰期时,发现swap频繁交换,CPU 100%,Load很高,基本体现为内存 ...