Visual studio之C#实现数字输入模拟键盘

摘要:
所以我想自己实现软键盘。这篇文章是来做记录的。在Load event表单中,添加所有标签控件的click event mybutton _ clicked,privatevoidlazerctrl _ Load{//注册键盘,单击事件keyb1。单击+=newEventHandler;keyb2。单击+=newEventHandler,keyb3。单击++=newEventHandler;keyb4。单击++=newEventHandler;keyb5。单击++=newEvent Handler;keyb6。单击+++=newEvents Handler,keyb7。单击++newEventHandler。keyb8。单击+=newEventHandler;keyb9.单击+=newEventHandler;keyb0.Click+=newEventHandler;键盘背面。单击+=newEventHandler Handler;密钥清除。单击+=newEventHandler;}在鼠标按钮事件中,将控件表示的数值填充到获得焦点的页面上的最后一个TextBox中。
背景

当前做的一个上位机需运行在工控机上,众所周知,工控机不可能配备键盘,只能是触屏,而我当前的上位机需要输入参数,于是之前的解决办法既是调用Windows自带的OSK.exe虚拟键盘,方法在我的另一外一篇博客Visual studio之C# 调用系统软键盘(外部"osk.exe")中已详述,但这种做法有两个致命缺陷,一是由于调用了外部.exe程序,国产杀毒软件会将我的上位机判定为疑似病毒文件(手动微笑);二是,若是该虚拟键盘被提前打开,我就没办法继续打开该软键盘使其在我的上位机界面之上,而该软键盘不是由我打开,我就获取不到它的Process,也就无法将其关闭重新打开,工控机的界面通常不会出现任务栏,因此虚拟键盘要是没有实体键盘就永远无法打开,头疼至极。于是就想到自己实现软键盘。便有此文,做个记录。
首先强调一下,本软键盘非真正意义的软键盘,只是用了很笨的方法在同一个界面上提供了一个数字输入的解决方案,实际效果如下:
Visual studio之C#实现数字输入模拟键盘第1张

正文
  • 为了不让按键在点击的时候获取焦点,所以我采用了label控件,一共12个控件,分别是0,1...9,退格,清除,对应的name分别为,keyb0,keyb1,```keb9,keybback,keybclear,对应的Text就是相应的0,1,2...9,退格,清除,为了调整所有按键大小,属性Autosize应该设置为false

  • 在窗体Load事件中,添加所有label控件的单击事件mybutton_clicked

        private void lazerctrl_Load(object sender, EventArgs e)
        {
            // 注册键盘按键单击事件
            keyb1.Click += new EventHandler(mybutton_clicked);
            keyb2.Click += new EventHandler(mybutton_clicked);
            keyb3.Click += new EventHandler(mybutton_clicked);
            keyb4.Click += new EventHandler(mybutton_clicked);
            keyb5.Click += new EventHandler(mybutton_clicked);
            keyb6.Click += new EventHandler(mybutton_clicked);
            keyb7.Click += new EventHandler(mybutton_clicked);
            keyb8.Click += new EventHandler(mybutton_clicked);
            keyb9.Click += new EventHandler(mybutton_clicked);
            keyb0.Click += new EventHandler(mybutton_clicked);
            keybback.Click += new EventHandler(mybutton_clicked);
            keybclear.Click += new EventHandler(mybutton_clicked);
        }

在鼠标按键事件中,将控件代表的数字值,填入到页面上最后一个获取到焦点的TextBox,内。这个lastfocustextbox 后面说明,

        // 执行按键操作
        void mybutton_clicked(object sender, EventArgs e)
        {
            Label clickbtn = (Label)sender;
            string strkey = clickbtn.Text;

            if ((lastfocustextbox == textBoxmhpU) || (lastfocustextbox == textBoxmhpD)
                || (lastfocustextbox == textBoxCWhpU) || (lastfocustextbox == textBoxCWhpD)
                || (lastfocustextbox == textBoxmptU) || (lastfocustextbox == textBoxmptD)
                || (lastfocustextbox == textBoxCWptU) || (lastfocustextbox == textBoxCWptD))
            {//不可编辑的textbox就跳过
            }
            else
            {

                if (strkey == "退格")
                {
                    string strNew = this.lastfocustextbox.Text;
                    if (strNew.Length >= 1)
                    {
                        strNew = strNew.Substring(0, strNew.Length - 1);
                        this.lastfocustextbox.Text = strNew;
                        this.lastfocustextbox.SelectionStart = this.lastfocustextbox.Text.Length;
                    }
                    this.lastfocustextbox.Focus();
                }
                else if (strkey == "清除")
                {
                    lastfocustextbox.Clear();
                }
                else
                {
                    lastfocustextbox.AppendText(strkey);
                }
            }
        }
  • 为了获知当前聚焦在哪个TextBox,就需要在窗体Load事件注册所有TextBoxEnter事件,并在事件中将最后一次获得聚焦的TextBox赋值给前文提及的lastfocustextbox 中,所以我说这是笨方法。: )
        private void lazerctrl_Load(object sender, EventArgs e)
        {
            // 注册textbox获取焦点事件
            textBoxmp.Enter += new EventHandler(text_getfocused);
            textBoxhz.Enter += new EventHandler(text_getfocused);
            textBoxduty.Enter += new EventHandler(text_getfocused);
            textBoxmlpU.Enter += new EventHandler(text_getfocused);
            textBoxmtU.Enter += new EventHandler(text_getfocused);
            textBoxmlpD.Enter += new EventHandler(text_getfocused);
            textBoxmtD.Enter += new EventHandler(text_getfocused);
            textBoxCWp.Enter += new EventHandler(text_getfocused);
            textBoxCWlpU.Enter += new EventHandler(text_getfocused);
            textBoxCWtU.Enter += new EventHandler(text_getfocused);
            textBoxCWlpD.Enter += new EventHandler(text_getfocused);
            textBoxCWtD.Enter += new EventHandler(text_getfocused);
            textBoxalertt.Enter += new EventHandler(text_getfocused);
            textBoxintervalt.Enter += new EventHandler(text_getfocused);

            textBoxmhpU.Enter += new EventHandler(text_getfocused);
            textBoxmhpD.Enter += new EventHandler(text_getfocused);
            textBoxCWhpU.Enter += new EventHandler(text_getfocused);
            textBoxCWhpD.Enter += new EventHandler(text_getfocused);
            textBoxmptU.Enter += new EventHandler(text_getfocused);
            textBoxmptD.Enter += new EventHandler(text_getfocused);
            textBoxCWptU.Enter += new EventHandler(text_getfocused);
            textBoxCWptD.Enter += new EventHandler(text_getfocused);
        }

此处注意lastfocustextbox 在窗体导入时,一定要赋值一个默认的TextBox,否则在未有一个TextBox获取焦点的情况下,用户点击按键,导致操作null,抛出异常,甚至直接使UI异常关闭。

        // 声明
        private System.Windows.Forms.TextBox lastfocustextbox;
        // 赋初始值
        lastfocustextbox = textBoxintervalt;
        // 获取最后一次获取焦点的Textbox
        void text_getfocused(object sender, EventArgs e)
        {
            TextBox focuedbox = (TextBox)sender;
            lastfocustextbox = focuedbox;
        }
  • 至此,按键的功能就可以实现了,但Lable毕竟不是按键,没有Button的效果,所以我们可以继续的为lable注册鼠标按下和弹起事件,在该事件内改变lable的边框,颜色,甚至是图片,使其有按键按下和弹起的效果,特别可以选一些按键按下和弹起的图片,那样效果会相当不错。同样,在窗体Load事件注册事件
        private void lazerctrl_Load(object sender, EventArgs e)
        {
            // 注册键盘按键鼠标按下事件
            keyb1.MouseDown += new MouseEventHandler(mybutton_down);
            keyb2.MouseDown += new MouseEventHandler(mybutton_down);
            keyb3.MouseDown += new MouseEventHandler(mybutton_down);
            keyb4.MouseDown += new MouseEventHandler(mybutton_down);
            keyb5.MouseDown += new MouseEventHandler(mybutton_down);
            keyb6.MouseDown += new MouseEventHandler(mybutton_down);
            keyb7.MouseDown += new MouseEventHandler(mybutton_down);
            keyb8.MouseDown += new MouseEventHandler(mybutton_down);
            keyb9.MouseDown += new MouseEventHandler(mybutton_down);
            keyb0.MouseDown += new MouseEventHandler(mybutton_down);
            keybback.MouseDown += new MouseEventHandler(mybutton_down);
            keybclear.MouseDown += new MouseEventHandler(mybutton_down);

            // 注册键盘按键鼠标弹起事件
            keyb1.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb2.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb3.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb4.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb5.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb6.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb7.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb8.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb9.MouseUp += new MouseEventHandler(mybutton_Up);
            keyb0.MouseUp += new MouseEventHandler(mybutton_Up);
            keybback.MouseUp += new MouseEventHandler(mybutton_Up);
            keybclear.MouseUp += new MouseEventHandler(mybutton_Up);
        }
        // 执行按键鼠标按下操作
        void mybutton_down(object sender, EventArgs e)
        {
            Label clickbtn = (Label)sender;
            clickbtn.BackColor = System.Drawing.SystemColors.ActiveCaption;
            clickbtn.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
        }

        // 执行按键鼠标弹起操作
        void mybutton_Up(object sender, EventArgs e)
        {
            Label clickbtn = (Label)sender;
            clickbtn.BackColor = System.Drawing.Color.Aqua;
            clickbtn.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        }

至此,记录完毕。

参考链接
  • 参考了很多,记不起来了,这么实现的灵感就来自于各种搜查的各类信息

记录时间:2017-6-11
记录地点:江苏淮安

免责声明:文章转载自《Visual studio之C#实现数字输入模拟键盘》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TortoiseGit安装、配置(Git 小乌龟安装)VMware vSphere 7.0 安装教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

selenim之ActionChains 用法

常见的点击方法集锦: 参数: 1.driver是我们的浏览器 2.Actions是我们系统内置的执行鼠标一系列操作的对象 鼠标左击:Actions actions=new Actions(driver); actions.click(这里传入我们需要点击的控件元素,WebElement类型).perform();...

【转】 中兴OLT-C300常用命令

中兴OLT C300show running-config (加载各种板卡)show gpon onu uncfg (查看OLT所有未配置的ONU)show gpon onu uncfg gpon-olt_1/3/2 (查看端口下未配置的ONU)show gpon onu state gpon-olt_1/2/1 (查看端口下ONU状态)show mac...

【Android游戏开发之四】基础的Android 游戏框架(一个游戏角色在屏幕行走的demo)

其实上一篇分析surfaceview的文章就是一个简单的游戏框架了,当然这里再强调一下,简单的游戏框架,以不要高手们不要乱喷哦  ~ 这个Demo是给群里一童鞋写的一个对图片操作以及按键处理,游戏简单框架的一个demo,这里放出给大家分享~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1...

App随机测试之Monkey和Maxim

Monkey是我们app测试熟知的一个工具,monkey可以随机的产生很多事件来操控app,所以可以用来做压力测试、稳定性测试 常用的几个选项:   -p 指定测试的包   -s 种子,以后回溯的时候只要运行相同的种子就可以回溯相同的monkey操作步骤了,常用来提供给开发复现问题、开发修复完毕以后验证是否修复完成   -v 日志 -v -vv 【-vv日...

monkey日志管理

日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。 monkey日志保存方法 保存在PC中 保存在手机上 标准流和错误流分开保存 保存在PC中 >adb shell monkey [op...

37、Android手势识别

手势识别 前面已经讲解了Android事件传递和自定义控件相关的知识,接下来介绍Android中手势的控制。说到触摸事件,不得不提的就是MotionEvent。 MotionEvent 事件坐标 每个触摸事件都代表用户在屏幕上的一个动作,而每个动作必定有其发生的位置。在MotionEvent中就有一系列与标触摸事件发生位置相关的函数: getX()和ge...