封装:钩子注册全局组合快捷键

用途:注册全局组合快捷键和快捷键调用的方法


需要系统钩子,网上有很多方法

下面介绍封装快捷键和注册快捷键方法

快捷键服务,主要用来监控按键、匹配快捷键和触发匹配快捷键方法 
 
    /// <summary> 系统快捷键服务 </summary>
    public class ShortCutHookService 
    {
        /// <summary> 创建监控引擎 </summary>
        public void CreateMonitor()
        {
            HookKeyboardEngine.KeyUp += HookKeyboardEngine_KeyUp;

            HookKeyboardEngine.KeyDown += HookKeyboardEngine_KeyDown;

            _current.Clear();
        }


        /// <summary> 停止殷勤 </summary>
        public void StopMonitor()
        {
            HookKeyboardEngine.KeyUp -= HookKeyboardEngine_KeyUp;

            HookKeyboardEngine.KeyDown -= HookKeyboardEngine_KeyDown;

            _current.Clear();

        }


        /// <summary> 按下键 </summary>
        private void HookKeyboardEngine_KeyDown(object sender, KeyEventArgs e)
        {
            KeyEntity k = new KeyEntity();
            k.Key = e.KeyCode;
            k.Time = DateTime.Now;
            Current.AddDown(k);
        }


        /// <summary> 抬起键 </summary>
        private void HookKeyboardEngine_KeyUp(object sender, KeyEventArgs e)
        {
            KeyEntity k = new KeyEntity();
            k.Key = e.KeyCode;
            k.Time = DateTime.Now;
            Current.RemoveDown(k);
            Current.Add(k);

            foreach (var item in _collection)
            {
                // Todo :匹配规则触发任务
                if (Current.Equals(item.Item1))
                {
                    item.Item2.Invoke();
                }
            }
        }

    

        // Todo :匹配规则记录 
        List<Tuple<ShortCutEntitys, Action>> _collection = new List<Tuple<ShortCutEntitys, Action>>();

        ShortCutEntitys _current = new ShortCutEntitys();
        /// <summary> 当前按钮记录  </summary>
        public ShortCutEntitys Current { get => _current; set => _current = value; }

        /// <summary> 注册执行命令 </summary>
        public void RegisterCommand(ShortCutEntitys match, Action action)
        {
            if (match == null) return;

            if (_collection.Count == 0)
            {
                this.CreateMonitor();
            }

            Tuple<ShortCutEntitys, Action> t = new Tuple<ShortCutEntitys, Action>(match, action);
            _collection.Add(t);
        }
    }



快捷键实体


主要用来匹配快捷键,序列化反序列化成文本

    /// <summary> 快捷按钮实体 </summary>
    public class ShortCutEntitys
    {
        List<KeyEntity> _keys = new List<KeyEntity>();

        /// <summary> 正常按键 </summary>
        internal List<KeyEntity> Keys { get => _keys; set => _keys = value; }

        private List<KeyEntity> _downKeys = new List<KeyEntity>();
        /// <summary> 按下的按键 </summary>
        public List<KeyEntity> DownKeys
        {
            get { return _downKeys; }
            set { _downKeys = value; }
        }

        /// <summary> 容器的大小 </summary>
        int capacity = 3;


        /// <summary> 增加正常按键 </summary>
        public void Add(KeyEntity key)
        {
            Keys.Add(key);

            if (Keys.Count > 3)
            {
                Keys.RemoveAt(0);
            }
        }

        /// <summary> 增加按下的按键 </summary>
        public void AddDown(KeyEntity key)
        {
            if (this.DownKeys.Exists(l => l.Key == key.Key)) return;

            this.DownKeys.Add(key);
        }

        /// <summary> 删除按下的按键 </summary>
        public void RemoveDown(KeyEntity key)
        {
            this.DownKeys.RemoveAll(l => l.Key == key.Key);
        }

        /// <summary> 是否包含指定快捷键 </summary>
        public override bool Equals(object obj)
        {
            if (!(obj is ShortCutEntitys)) return false;

            ShortCutEntitys s = obj as ShortCutEntitys;

            // Todo :比较按下键 
            if (this.DownKeys.Count != s.DownKeys.Count) return false;

            foreach (var item in s.DownKeys)
            {
                if (!this.DownKeys.Exists(l => l.Key == item.Key)) return false;
            }

            // Todo :非按下键 
            if (Keys.Count < s.Keys.Count) return false;

            for (int i = 0; i < s.Keys.Count; i++)
            {
                // Todo :比较按键是否一样 
                if (this.Keys[this.Keys.Count - i - 1].Key != s.Keys[s.Keys.Count - i - 1].Key)
                {
                    return false;
                }

                // Todo :判断时间间隔 
                if (i == s.Keys.Count - 1) continue;

                if ((this.Keys[this.Keys.Count - i - 1].Time - this.Keys[this.Keys.Count - i - 2].Time).Seconds > ShortCutConfiger.SplitSecond)
                {
                    return false;
                }
            }




            return true;
        }

        /// <summary> 转换可视化文本 </summary>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            foreach (var item in this._downKeys)
            {
                sb.Append(item.Key + ShortCutConfiger.downChar.ToString() + ShortCutConfiger.SptitString.ToString());
            }

            foreach (var item in this.Keys)
            {
                sb.Append(item.Key + ShortCutConfiger.SptitString);
            }

            return sb.ToString().Trim(ShortCutConfiger.SptitChar);
        }

        public void Clear()
        {
            this.DownKeys.Clear();
            this.Keys.Clear();
        }


        /// <summary> 根据文本生成规则 </summary>
        public static ShortCutEntitys DeSerilse(string str)
        {
            if (string.IsNullOrEmpty(str)) return null;

            var ss = str.Split(ShortCutConfiger.SptitChar);

            var ds = ss.ToList().FindAll(l => l.EndsWith(ShortCutConfiger.downChar.ToString()));

            var ns = ss.Except(ds);

            ShortCutEntitys s = new ShortCutEntitys();

            foreach (var item in ds)
            {
                KeyEntity ke = new KeyEntity();
                Keys k = (Keys)Enum.Parse(typeof(Keys), item.Trim(ShortCutConfiger.downChar));
                ke.Key = k;
                s.AddDown(ke);
            }


            foreach (var item in ns)
            {
                KeyEntity ke = new KeyEntity();
                Keys k = (Keys)Enum.Parse(typeof(Keys), item.Trim(ShortCutConfiger.downChar));
                ke.Key = k;
                s.Add(ke);
            }



            return s;
        }
    }


其他配置和实体

    /// <summary> 配置信息 </summary>
    class ShortCutConfiger
    {
        /// <summary> 间隔字符 </summary>
        public const char SptitChar = '+';

        /// <summary> 间隔字符串 </summary>
        public const string SptitString = "+";

        /// <summary> 触发范围 </summary>
        public const double SplitSecond = 0.1;

        /// <summary> 按下状态 </summary>
        public const char downChar = '↓';

    }
    /// <summary> 键盘按键 </summary>
    public class KeyEntity
    {
        private Keys _key;
        /// <summary> 按下的键 </summary>
        public Keys Key
        {
            get { return _key; }
            set { _key = value; }
        }

        private DateTime _time;
        /// <summary> 按下的时间 </summary>
        public DateTime Time
        {
            get { return _time; }
            set { _time = value; }
        }
    }

测试代码:

 1、按下Shift和D键触发

ShortCutEntitys s= ShortCutEntitys.DeSerilse("LShiftKey↓+D");

           

            Action action2 = () =>
            {
                s.ToString();

                Debug.WriteLine(s.ToString());
            };

            ShortCutHookService.Instance.RegisterCommand(s, action2);


2、双击D键触发


 ShortCutEntitys s = new ShortCutEntitys();

            KeyEntity k = new KeyEntity();
            k.Key = Keys.D;
            s.Add(k);


            KeyEntity c = new KeyEntity();
            c.Key = Keys.D;
            s.Add(c);


            Action action2 = () =>
            {
                s.ToString();

                Debug.WriteLine(s.ToString());
            };

            ShortCutHookService.Instance.RegisterCommand(s, action2);


3、按下D键+F键组合

            ShortCutEntitys s = new ShortCutEntitys();

            KeyEntity k = new KeyEntity();
            k.Key = Keys.D;
            s.AddDown(k);

            KeyEntity c = new KeyEntity();
            c.Key = Keys.F;
            s.Add(c);

            Action action2 = () =>
            {
                s.ToString();

                Debug.WriteLine(s.ToString());
            };

            ShortCutHookService.Instance.RegisterCommand(s, action2);




注:

1、通过此方法可以快速构建快捷键和快捷键对应的方法

2、利用全局钩子构建,可以不用在程序中操作也可以监测

3、按键组合多样



猜你喜欢

转载自blog.csdn.net/u010975589/article/details/78711146
今日推荐