C#编程学习(07):自动监测大写键是否被锁定

简介: C#编程学习(07):自动监测大写键是否被锁定

一、需求说明:在使用笔记本电脑执行一些操作时,可能会频繁用到大小写键切换;本示例主要采用标签和无边框窗体演示,CapsLocks键的状态


二、练习知识点:


//第一,无边框窗体的鼠标拖动窗体移动问题

//第二,自动监听键盘大写键是否按下,并将其状态显示在窗体的Label控件上

//第三,添加右键关闭窗体


三、需求实现


3.1 界面说明


2018122508541828.png


使用到的控件:Label用于显示键盘状态信息;ContextMenuStrip用于设计右键关闭应用程序


3.2 窗体基本设置


//用于设计无边框窗体


  //用于设计窗体根据其控件内容调整其大小    


//允许接收键盘上的按键信息


3.3给窗体添加Form1_KeyDown和Form1_KeyUp事件处理程序,监测大写键是否锁定


2018122508574613.png


代码如下:

 //监听键盘按键抬起,即大写键已锁定      
        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属性绑定

2018122509024677.png

(2)点击ContextMenuStrip控件(红1),在(红2)处的ToolStripMenuItem项设为“关闭”

20181225090448652.png


(3)双击(红2),添加如下代码:


        private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();//终止当前程序运行
        }

3.5 鼠标拖动移动窗体位置

在FormBorderStyle属性设置为None时,鼠标拖动窗体位置无法移动;因此,需为窗体添加如下三个事件:

20181225091441544.png

添加变量:

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)大写键锁定解除

2018122509240620.png

(2)大写键锁定

20181225092327316.png

(3)右键关闭

20181225092533352.png

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窗体常用属性归纳

image.png

image.png

相关文章
|
6天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
18 3
|
26天前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
27天前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
|
2月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
39 2
|
2月前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
70 11
|
2月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue<T>`和`ConcurrentDictionary<TKey, TValue>`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
46 1
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
77 2
|
6月前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
75 0
|
2月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
76 0