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();
}
}
}