Winform自定义键盘控件开发及使用
时间:2019-09-26
本文章向大家介绍Winform自定义键盘控件开发及使用,主要包括Winform自定义键盘控件开发及使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近有学员提出项目中要使用键盘控件,系统自带的osk.exe不好用,于是就有了下面的内容:
首先是进行自定义键盘控件的开发,其实核心大家都知道,就是利用SendKeys.Send发送相应
的字符,但是为了做完整,还是加了一些其他的代码,具体样式如下图所示:
源码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace xktControl { public enum KeyBorderCharType { CHAR = 1, NUMBER = 2 } public partial class xktKeyBoard : UserControl { public xktKeyBoard() { InitializeComponent(); this.tableLayoutPanel2.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; EventHandle(this); } private void EventHandle(Control ctl) { foreach (Control item in ctl.Controls) { if (item is Label lb) { lb.MouseDown += KeyDown_MouseDown; } else if (item.HasChildren) { EventHandle(item); } } } [Browsable(true), Description("按键点击事件"), Category("自定义属性")] public event EventHandler KeyClick; [Browsable(true), Description("回车点击事件"), Category("自定义属性")] public event EventHandler EnterClick; /// <summary> /// Occurs when [backspace clike]. /// </summary> [Browsable(true), Description("删除点击事件"), Category("自定义属性")] public event EventHandler BackspaceClick; /// <summary> /// Occurs when [retract clike]. /// </summary> [Browsable(true), Description("关闭点击事件"), Category("自定义属性")] public event EventHandler CloseClick; private void KeyDown_MouseDown(object sender, MouseEventArgs e) { if (sender is Label lbl) { if (string.IsNullOrEmpty(lbl.Text)) { return; } if (lbl.Text == "CAP") { ToUpperOrLower(this,true); lbl.Text = "cap"; } else if (lbl.Text == "cap") { ToUpperOrLower(this,false); lbl.Text = "CAP"; } else if (lbl.Text == "?123" || lbl.Text == "abc.") { ChangeShow(this); } else if (lbl.Text == "空格") { SendKeys.Send(" "); } else if (lbl.Text.ToLower() == "shift") { SendKeys.Send("+"); if (lbl.Text == "shift") { lbl.Text = "SHIFT"; lbl.Tag = "SHIFT"; } else { lbl.Text = "shift"; lbl.Tag = "shift"; } } else if (lbl.Text == "删除") { SendKeys.Send("{BACKSPACE}"); BackspaceClick?.Invoke(sender, e); } else if (lbl.Text == "回车") { SendKeys.Send("{ENTER}"); EnterClick?.Invoke(sender, e); } else if (lbl.Text == "关闭") { CloseClick?.Invoke(this, e); } else { string Str = "{" + lbl.Text + "}"; SendKeys.Send(lbl.Text); KeyClick?.Invoke(sender, e); } } } private KeyBorderCharType charType = KeyBorderCharType.CHAR; [Browsable(true), Description("显示样式"), Category("自定义属性")] public KeyBorderCharType CharType { get { return charType; } set { charType = value; if (value == KeyBorderCharType.CHAR) { if (lbl_NumChar.Text.ToLower() == "abc.") { ChangeShow(this); } } else { if (lbl_NumChar.Text.ToLower() == "?123") { ChangeShow(this); } } } } private void ToUpperOrLower(Control ctl, bool bln) { foreach (Control item in ctl.Controls) { if (item is Label lbl) { if (lbl.Text == "abc." || lbl.Text.ToLower() == "shift") return; lbl.Text = bln ? lbl.Text.ToUpper() : lbl.Text.ToLower(); } else if (item.HasChildren) { ToUpperOrLower(item, bln); } } } private void ChangeShow(Control ctl) { foreach (Control item in ctl.Controls) { if (item is Label lb) { string strTag = lb.Text; lb.Text = lb.Tag.ToString(); lb.Tag = strTag; } else if (item.HasChildren) { ChangeShow(item); } } } } }
实际应用效果如下:
原文地址:https://www.cnblogs.com/xiketangedu/p/11589005.html
- 嵌入式数据库Perst
- USB 设备的PID-Product ID,VID-Vendor ID
- Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由
- IIS7上部署Asp.Net4.0时UrlRouting的若干问题
- As3.0中的反射
- 域名yg.cc以10.2万元的价格结拍,可搭建“摇滚”音乐平台
- 修改 Windows Host 文件工具
- win7下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化”
- WCF和ASP.NET Web API 接口执行时间监控
- 额的神啊:AS3中Button被disable了,也会触发Click事件!
- [原创]CI持续集成系统环境---部署gerrit环境完整记录
- CentOS设置Mono环境变量
- 分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控
- 从APM角度上看:NoSQL和关系数据库并无不同
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7下用户登录失败N次后锁定用户禁止登陆的方法
- Linux服务器被黑以后的详细处理步骤
- linux下用户程序同内核通信详解(netlink机制)
- yum安装本地rpm软件方案详解
- CentOS 部署 flask项目的方法
- 在linux服务器下使用版本控制软件SVN的方法
- centos中yum命令删除还原的补救方法介绍
- Linux 创建子进程执行任务的实现方法
- Linux系统下安装jdbc与tomcat的图文教程
- Linux系统下利用C程序输出某进程的内存占用信息
- .NET Standard中配置TargetFrameworks输出多版本类库
- .NET Standard SDK 样式项目中的目标框架
- 偿还技术债(2)-EventBus自己实现一个?
- AkShare-债券数据-收盘收益率曲线
- Vue 项目报错:‘$‘ is not defined ( no-undef )