一、需求说明:在使用笔记本电脑执行一些操作时,可能会频繁用到大小写键切换;本示例主要采用标签和无边框窗体演示,CapsLocks键的状态
二、练习知识点:
//第一,无边框窗体的鼠标拖动窗体移动问题
//第二,自动监听键盘大写键是否按下,并将其状态显示在窗体的Label控件上
//第三,添加右键关闭窗体
三、需求实现
3.1 界面说明
使用到的控件:Label用于显示键盘状态信息;ContextMenuStrip用于设计右键关闭应用程序
3.2 窗体基本设置
//用于设计无边框窗体
//用于设计窗体根据其控件内容调整其大小
//允许接收键盘上的按键信息
3.3给窗体添加Form1_KeyDown和Form1_KeyUp事件处理程序,监测大写键是否锁定
代码如下:
//监听键盘按键抬起,即大写键已锁定 private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.CapsLock) { label1.Text = "当前键盘状态处于:大写锁定状态!"; } } //监听键盘按键抬起,即大写键锁定已解除 private void Form1_KeyUp(object sender, KeyEventArgs e) { if (!Control.IsKeyLocked(Keys.CapsLock)) { label1.Text = "当前键盘状态处于:小写锁定状态!"; } }
3.4 为窗体添加右键菜单
(1)添加ContextMenuStrip控件,并将其与窗体的ContextMenuStrip属性绑定
(2)点击ContextMenuStrip控件(红1),在(红2)处的ToolStripMenuItem项设为“关闭”
(3)双击(红2),添加如下代码:
private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit();//终止当前程序运行 }
3.5 鼠标拖动移动窗体位置
在FormBorderStyle属性设置为None时,鼠标拖动窗体位置无法移动;因此,需为窗体添加如下三个事件:
添加变量:
1. private Point mouseOffset; //记录鼠标指针的坐标 2. private bool isMouseDown = false; //记录鼠标按键是否按下
添加代码:
//监听鼠标左键按下后的点位坐标 private void Form1_MouseDown_1(object sender, MouseEventArgs e) { int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X; yOffset = -e.Y; mouseOffset = new Point(xOffset, yOffset); isMouseDown = true; } } //监听鼠标移动过程记录其状态变换时的坐标 private void Form1_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); Location = mousePos; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { // 修改鼠标状态isMouseDown的值 // 确保只有鼠标左键按下并移动时,才移动窗体 if (e.Button == MouseButtons.Left) { isMouseDown = false; } }
3.5 结果演示
(1)大写键锁定解除
(2)大写键锁定
(3)右键关闭
4 总结
4.1 监听CapsLock键状态的三种方式
(1)自写函数监视
//声明部分 [DllImport("user32.dll", EntryPoint = "GetKeyboardState")] public static extern int GetKeyboardState(byte[] pbKeyState); //自写函数监听键盘按键 //实现部分,如果按键索引码为14,则为大写键,返回为真 public static bool CapsLockStatus { get { byte[] bs = new byte[256]; GetKeyboardState(bs); return (bs[0x14] == 1); } }
(2)使用事件的e参数:
e.KeyCode == Keys.CapsLock
(3)使用控件类Control
Control.IsKeyLocked(Keys.CapsLock)
4.2 Form窗体常用属性归纳