//以下是抽象类,主要是看着内部只有逻辑的代码出现了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);}}
}

转载于:https://www.cnblogs.com/ly45/p/5513880.html

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

  1. Z-Stack通过按键中断实现长按功能

    一.功能介绍 项目需要实现长按功能,实现按键有2种方式,一种是通过中断.一种KEY_CHANGE事件轮询的方式.由于中断更加的灵敏,这里选择中断的方式.意外的发现,如果开启了中断,那么按键就不会触发K ...

  2. oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。...

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...

  3. php 性能日志,php性能分析之php-fpm慢执行日志slow log用法浅析

    本文实例讲述了php性能分析之php-fpm慢执行日志slow log用法.分享给大家供大家参考,具体如下: 众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql ...

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

                DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰               (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本 ...

  5. explain ref_用 Explain 命令分析 MySQL 的 SQL 执行

    在上一篇文章<MySQL常见加锁场景分析>中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要. 比 ...

  6. 单片机基于独立按键的屏幕翻页/功能选择方案(支持长按,短按,双击操作)

    功能概述 本按键方案硬件部分由两个独立按键组成, 在移植后能够适配市面上绝大部分单片机. 独立按键分为A, B两键, 轻击A键代表上一页, 轻击B键代表下一页, 同时开发者可自由定义双击, 长按操作的 ...

  7. 无法自动进入并单步执行服务器_膳食纤维无法进入血液执行营养功能,吃它有啥用?...

    膳食纤维是植物性食物中所含不能被人体吸收.消化分解利用的碳水化合物,包含纤维素.半纤维素.木质秦和果胶等物质.其中,膳食纤维根据其水溶性又可再分为可溶性和不可水溶性.可溶性膳食纤维包括果胶.藻胶.树胶 ...

  8. 批处理定时执行任务_[Abaqus tips ] 分析任务的定时执行

    Abaqus分析计划任务的批处理执行,基于windows的批处理文件的实现和基于python脚本的实现,大家应该都很熟悉了,通过事先编译好的脚本文件来批处理计划任务,简单示例如下: windows 批 ...

  9. 分享ricequant量化交易接口是如何执行交易功能?

    ricequant量化交易接口执行交易功能不仅要包含基本的自动交易功能,还需要能够支持策略完成订单管理.资金管理和持仓管理功能,这样量化策略才能够全权接手交易大权. 适用场景: 关于交易的所有功能:下 ...

最新文章

  1. 微软亚洲研究院成立OpenNetLab,探索以“数据为中心”AI网络研究新范式!
  2. JAVA WEB新进展
  3. python菜鸟教程h-Python 命令行参数
  4. Leetcode 435.无重叠区间 (每日一题 20210708 同类型题)
  5. 七十三、Python | Leetcode数字系列(上篇)
  6. Http协议--Get和Post区别
  7. 影响大数据和分析的5大趋势
  8. [ Typescript 手册] JavaScript `Date` 在 Typescript 中的接口
  9. BGP(3):BGP 的路径优选
  10. JS项目(制作随机选号页面)
  11. vue中引用BScroll监听上拉加载报错
  12. 截图工具-picpick绿色破解版免安装
  13. 如何成为高手?嵌入式开发进阶之路...
  14. linux中增加用户
  15. 以图搜图(一):python aHash算法
  16. PDF编辑工具怎么为PDF文件添加页码
  17. Myabtis-Plus(高级查询)
  18. [RCTF2019]printer详解(python脚本、USB协议精解、TSLP2文档阅读)
  19. Datawhale成员上榜!
  20. 下列属于usb转串口的芯片是_USB转串口芯片——FT232R

热门文章

  1. vscode remote 第三方库_分钟将vscode撸成小霸王
  2. Android 7.0后 播放U盘中的视频文件的解决方案
  3. opencv 识别机车
  4. java中 static变量和方法到底是存在内存什么区域?
  5. [Yarn] Yarn local-dirs are bad 导致节点处于不健康状态
  6. [Elasticsearch] es 6.8 编译报错 invalid type code: 85
  7. 【Elasticsearch】 Elasticsearch slop管理间隔字符查数据
  8. 【Kafka】A broker is already registered on the path /brokers/ids/0. This probably indicates that you
  9. Spring Boot 操作 Memcache
  10. org.neo4j.kernel.StoreLockException: Store and its lock file has been locked by another process