using ryCommon; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace SysFuns { /// /// 热键转换类 /// public class HotkeyValue { /// /// 功能键。 /// public Keys Modifiers { get; private set; } = Keys.None; /// /// 修改键。 /// public int Modifiers_Int { get; private set; } = 0; /// /// 转换功能键到谷歌浏览器专用 /// public int Chrome_Modifiers { get { int Pb_Modifiers = 0; try { if ((Modifiers_Int & 4) == 4) { Pb_Modifiers += 2; } if ((Modifiers_Int & 2) == 2) { Pb_Modifiers += 4; } if ((Modifiers_Int & 1) == 1) { Pb_Modifiers += 8; } } catch { } return Pb_Modifiers; } } /// /// 将chrome功能键转换为普通功能键 /// /// /// public int Modifiers_FromChrome(int _Modifiers) { int Pb_Modifiers = 0; try { if ((_Modifiers & 2) == 2) { Pb_Modifiers += 4; } if ((_Modifiers & 4) == 4) { Pb_Modifiers += 2; } if ((_Modifiers & 8) == 8) { Pb_Modifiers += 1; } } catch { } return Pb_Modifiers; } /// /// 按键值。 /// public Keys KeyCode { get; private set; } = Keys.None; /// /// 初始化类 的新实例。 /// /// The modifiers. /// The key code. public HotkeyValue(Keys modifiers, Keys keyCode) { LoadHotKey(modifiers, keyCode); } /// /// /// /// /// public HotkeyValue(int Modifiers, int T_Key) { this.Modifiers = ConvertModifier(Modifiers); this.Modifiers_Int = Modifiers; this.KeyCode = (Keys)T_Key; } /// /// /// /// public HotkeyValue(string hotkey) { LoadHotKey(hotkey); } /// /// 初始化类 的新实例。 /// public HotkeyValue() { LoadHotKey(Keys.None, Keys.None); } /// /// 加载热键 /// /// /// public void LoadHotKey(Keys modifiers, Keys keyCode) { this.Modifiers = modifiers; this.KeyCode = keyCode; int m_key = 0; Keys m_Modifiers = Modifiers; if ((m_Modifiers & Keys.Alt) != 0) { m_key |= 1; } else if ((m_Modifiers & Keys.Control) != 0) { m_key |= 2; } else if ((m_Modifiers & Keys.Shift) != 0) { m_key |= 4; } else if ((m_Modifiers & Keys.LWin) != 0) { m_key |= 8; } this.Modifiers_Int = m_key; } /// /// 加载热键 /// /// public void LoadHotKey(string hotkey) { int T_Modifiers = 0; Keys T_Key = Keys.None; try { string[] item = hotkey.Split('+'); if (item.Length == 1 && item[0].IsInt()) { T_Modifiers = 0; T_Key = (Keys)item[0].ToInt(0); } else if (item.Length == 2 && item[0].IsInt() && item[1].IsInt()) { T_Modifiers = item[0].ToInt(0); T_Key = (Keys)item[1].ToInt(0); } } catch { } this.Modifiers_Int = T_Modifiers; this.Modifiers = ConvertModifier(T_Modifiers); this.KeyCode = T_Key; } /// /// 加载热键 /// /// public void LoadHotKeyStr(string hotkey) { int T_Modifiers = 0; Keys T_Key = Keys.None; try { string[] item = hotkey.Split('+'); if (item.Length == 1) { T_Modifiers = 0; var key = item[0]; if(key.Length==1) { T_Key = Keys.None; } else { GetKey(key); } } else if (item.Length == 2) { if (!IsModifiersKey(item[0])) { T_Modifiers = 0; T_Key = Keys.None; } else { var mkeys = Enum.Parse(typeof(SysFuns.KeyModifiers), item[0]); T_Modifiers = (int)mkeys; GetKey(item[1]); } } else if (item.Length == 3) { if (!IsModifiersKey(item[0]) || !IsModifiersKey(item[1]) || item[0] == item[1]) { T_Modifiers = 0; T_Key = Keys.None; } else { var mkeys1 = Enum.Parse(typeof(SysFuns.KeyModifiers), item[0]); var mkeys2 = Enum.Parse(typeof(SysFuns.KeyModifiers), item[1]); T_Modifiers = (int)mkeys1 + (int)mkeys2; GetKey(item[2]); } } else if (item.Length ==4) { if (!IsModifiersKey(item[0]) || !IsModifiersKey(item[1]) || !IsModifiersKey(item[2]) || item[0] == item[1] || item[1] == item[2] || item[2] == item[3]) { T_Modifiers = 0; T_Key = Keys.None; } else { var mkeys1 = Enum.Parse(typeof(SysFuns.KeyModifiers), item[0]); var mkeys2 = Enum.Parse(typeof(SysFuns.KeyModifiers), item[1]); var mkeys3 = Enum.Parse(typeof(SysFuns.KeyModifiers), item[1]); T_Modifiers = (int)mkeys1 + (int)mkeys2 + (int)mkeys3; GetKey(item[3]); } } } catch { } bool IsModifiersKey(string _key) { return Enum.TryParse(_key, out KeyModifiers mkey); } void GetKey(string _key) { if (_key == "Enter") { T_Key = Keys.Enter; } else if (_key == "Esc") { T_Key = Keys.Escape; } else if (_key == "PgDn") { T_Key = Keys.PageDown; } else { try { if (!Enum.TryParse(_key, out T_Key)) { T_Modifiers = 0; T_Key = Keys.None; } else { var keys = Enum.Parse(typeof(Keys), _key); T_Key = (Keys)keys; } } catch { } } } this.Modifiers_Int = T_Modifiers; this.Modifiers = ConvertModifier(T_Modifiers); this.KeyCode = T_Key; } private Keys ConvertModifier(int Modifiers) { Keys m_Modifiers = Keys.None; if ((Modifiers & 1) != 0) { m_Modifiers |= Keys.Alt; } if ((Modifiers & 2) != 0) { m_Modifiers |= Keys.Control; } if ((Modifiers & 4) != 0) { m_Modifiers |= Keys.Shift; } if ((Modifiers & 8) != 0) { m_Modifiers |= Keys.LWin; } return m_Modifiers; } /// /// 判断是否是热键 /// public bool IsHotKey => KeyCode != Keys.None || (Modifiers == Keys.None && KeyCode > Keys.A && KeyCode < Keys.Z); /// /// 获取当前热键 /// public string HotKey { get { if (KeyCode == Keys.None) { return "0"; } return Modifiers_Int.ToString() + "+" + ((int)KeyCode).ToString(); } } /// /// 已重载,返回“Ctrl+Alt+A”格式的字符串。 /// /// 类似“Ctrl+Alt+A”格式的字符串 public override string ToString() { string sbt = ""; if ((this.Modifiers & Keys.Control) != 0) { sbt += "Ctrl+"; } if ((this.Modifiers & Keys.Shift) != 0) { sbt += "Shift+"; } if ((this.Modifiers & Keys.Alt) != 0) { sbt += "Alt+"; } if ((this.Modifiers & Keys.LWin) != 0 || (this.Modifiers & Keys.RWin) != 0) { sbt += "Win+"; } if (this.KeyCode != Keys.None) sbt += this.KeyCode.ToString(); if (sbt.Length != 0) { return sbt; } else { return "无热键"; } } /// /// 返回“Ctrl+Alt+A”格式的字符串。 /// /// 类似“Ctrl+Alt+A”格式的字符串 public string ToStr() { return ToString(); } } }