本实例全部文章目录
(一)功能概览
(二)创建项目、注册热键、显示截图主窗口
(三)托盘图标及菜单的实现
(四)基本截图功能实现
(五)针对拖拽时闪烁卡顿现象的优化
(六)添加配置管理功能
(七)添加放大镜的功能
(八)添加键盘操作截图的功能
(九)使用自定义光标,QQ截图时的光标
(十)在截图中包含鼠标指针形状
虽然添加了放大镜的功能,但是在进行像素级的定位时,还是不容易精确定位,在用鼠标操作时要改变一两个像素的位置还是有些困难的。
处理键盘按下事件
/// <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键不要松开,再按上下左右键可以改变截图区域的大小。