分析按键序列以执行不同功能。但又从中抽象出来一个,暂时不知道还能用作别的不。

//以下是抽象类,主要是看着内部只有逻辑的代码出现了Keys这种很具体的类型,不爽。说不定会用作别的。using System.Collections.Generic;

namespace KeyboardSynchronizer {
    public abstract class FuncQueue<T> {
        public bool Adding { get; private set; }
        private T toggler;
        public int Id { get; private set; }
        public int Index { get; private set; } = -1;
        public List<T> Parameters { get; } = new List<T>();
        protected abstract T Empty { get; }
        /// <summary>
        /// Insert these to stop adding more parameters and reset this instance.
        /// </summary>
        public T[] Restarter { get; set; }

        protected abstract bool IsIndexElement(T t);
        protected abstract int CreateNewIndex(T t);
        protected abstract bool Equals(T a, T b);

        public void Insert(T t) {
            if (Equals(t, Empty)) {
                return;
            }
            if (IsIndexElement(t)) {
                if (Adding) {
                    add(t);
                } else {
                    Index = CreateNewIndex(t);
                }
            } else {
                if (Equals(toggler, Empty)) {
                    toggler = t;
                } else if (Equals(toggler, t)) {
                    if (Adding) {
                        add(t);
                    } else {
                        if (Index == -1) {
                            Id++;
                        } else {
                            Adding = true;
                        }
                    }
                } else {
                    if (Adding) {
                        add(t);
                    } else {
                        toggler = t;
                        Id = 0;
                        Index = -1;
                    }
                }
            }
        }

        private void add(T t) {
            if (Restarter != null && Restarter.Length > 0 && Parameters.Count + 1 >= Restarter.Length && Equals(Restarter[Restarter.Length - 1], t)) {
                var i = Parameters.Count - 1;
                var j = Restarter.Length - 2;
                for (; i >= 0 && j >= 0;) {
                    if (Equals(Parameters[i], Restarter[j])) {
                        i--;
                        j--;
                        continue;
                    }
                    Parameters.Add(t);
                    return;
                }
                Adding = false;
                Id = 0;
                toggler = Empty;
                Index = -1;
                Parameters.Clear();
            } else {
                Parameters.Add(t);
            }
        }
    }
}//以下是实现类,用于自定义快捷键,先按下一个键X一次或多次,用于区分不同功能,然后按一些数字,指定第一个参数,再次按X,结束指定第一个参数,并开始输入更多参数。
using System.Linq;
using System.Windows.Forms;

namespace KeyboardSynchronizer {
    public class KeysQueue : FuncQueue<Keys> {
        static Keys[] numbers = { Keys.D0, Keys.D1, Keys.D2, Keys.D3, Keys.D4, Keys.D5, Keys.D6, Keys.D7, Keys.D8, Keys.D9 };
     public KeysQueue(){      Restarter = new[] { Keys.S, Keys.T, Keys.O, Keys.P };     }  
        protected override Keys Empty {
            get { return Keys.None; }
        }

        protected override bool Equals(Keys a, Keys b) {
            return a == b;
        }

        protected override int CreateNewIndex(Keys t) {
            var v = (Index > -1 ? Index.ToString() : string.Empty) + t.ToString()[1];
            try {
                return int.Parse(v);
            } catch {
                return Index;
            }
        }

        protected override bool IsIndexElement(Keys t) {
            return numbers.Contains(t);
        }
    }
}

				
时间: 2024-10-10 06:32:43

分析按键序列以执行不同功能。但又从中抽象出来一个,暂时不知道还能用作别的不。的相关文章

Zigbee协议栈内核分析 - 按键分析

Zigbee协议栈内核分析 - 按键分析(轮询) Jesse 协议栈按键代码分析 - 思维导图(放大可看) 一.综述 上图从协议栈的 main() 函数开始分析,罗列出了 main()  函数里调用的函数.接下来我们将会对函数一个一个的分析,有关于 key 的函数我将会用黄色方框表示. 二.协议栈代码分析(按照上图逐步分析) 1.osal_int_disable( INTS_ALL );           //关闭总中断 2.HalDriverInit(); 调用 HalKeyInit(); 

debian下使用dynamic printk分析usb转串口驱动执行流程

看了一篇文章<debug by printing>,文中提到了多种通过printk来调试驱动的方法,其中最有用的就是"Dynamic debugging". “Dynamic debugging"的官方文档:http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/dynamic-debug-howto.txt?id=HEAD "Dyanmic de

DB查询分析器7.01新增的周、月SQL执行计划功能

马根峰              (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query Analyzer>.它具有强大的功能.友好的操作界面.良好的操作性.跨越各种数据库平台乃至于EXCEL和文本文件. 你可以通过它 ① 查询ODBC数据源(包括世面上所有的数据库.TXT/CSV文件.EXC

angularjs源码分析之:angularjs执行流程

angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,link,scope,isolate scope,双向绑定,mvvm等.最近准备把这些都慢慢搞懂,分析源码并贴到博客园,如有分析不对的地方,还望各位包容并指正. angularjs源码分析之:angularjs执行流程 先上个大图,有个大概印象,注:angularjs的版本为:1.2.1,通过bowe

图库Gallery3D(Gallery2)分析(四) 菜单命令执行过程分析

该分析基于 Android4.2的Gallery2 1 菜单创建过程分析. Gallery的父类是AbstractGalleryActivity类,AbstractGalleryActivity的父类是Activity类.所以菜单创建是调用的AbstractGalleryActivity的菜单创建函数. public class AbstractGalleryActivity extends Activity implements GalleryContext { private static

Kafka源码分析-序列4 -Producer -network层核心原理

在上一篇我们分析了Java NIO的原理和使用方式,本篇将进一步分析Kafka client是如何基于NIO构建自己的network层. network层的分层架构 下图展示了从最上层的KafkaProducer到最底层的Java NIO的构建层次关系: 图中淡紫色的方框表示接口或者抽象类,白色方框是具体实现. 整个架构图也体现了"面向接口编程"的思想:最底层Java NIO往上层全部以接口形式暴露,上面的3层,也都定义了相应的接口,逐层往上暴露. 接口的实例化(包括KafkaClie

ASP.NET MVC4计划任务实现方法(定时执行某个功能)

系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在Application_Start方法最下面加入: //定义定时器 //1000表示1秒的意思 System.Timers.Timer myTimer = new System.Timers.Timer(1000); //TaskAction.SetContent 表示要调用的方法 myTimer.

ASP.NET MVC计划任务实现方法(定时执行某个功能)

系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在Application_Start方法最下面加入: //定义定时器 //1000表示1秒的意思 System.Timers.Timer myTimer = new System.Timers.Timer(1000); //TaskAction.SetContent 表示要调用的方法 myTimer.

复杂度分析(上)如何分析统计算法的执行效率和资源消耗

一.什么是复杂度分析? 数据结构和算法解决是“如何让计算机更快时间.更省空间的解决问题”. 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 二.为什么要进行复杂度分析? 2.1 事后统计法 2.2.1 概念 通过运行代码跑,统计.监控,得到算法执行的时间和占用的内存大小. 2.2.2 劣势 测试结果非常依赖测试环境.测试环境中硬件的不同会对测试结