309 lines
10 KiB
C#
309 lines
10 KiB
C#
using ryCommon;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows.Forms;
|
||
|
||
namespace SysFuns
|
||
{
|
||
/// <summary>
|
||
/// 热键转换类
|
||
/// </summary>
|
||
public class HotkeyValue
|
||
{
|
||
/// <summary>
|
||
/// 功能键。
|
||
/// </summary>
|
||
public Keys Modifiers { get; private set; } = Keys.None;
|
||
/// <summary>
|
||
/// 修改键。
|
||
/// </summary>
|
||
public int Modifiers_Int { get; private set; } = 0;
|
||
/// <summary>
|
||
/// 转换功能键到谷歌浏览器专用
|
||
/// </summary>
|
||
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;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 将chrome功能键转换为普通功能键
|
||
/// </summary>
|
||
/// <param name="_Modifiers"></param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
/// <summary>
|
||
/// 按键值。
|
||
/// </summary>
|
||
public Keys KeyCode { get; private set; } = Keys.None;
|
||
/// <summary>
|
||
/// 初始化类 <see cref="HotkeyValue"/> 的新实例。
|
||
/// </summary>
|
||
/// <param name="modifiers">The modifiers.</param>
|
||
/// <param name="keyCode">The key code.</param>
|
||
public HotkeyValue(Keys modifiers, Keys keyCode)
|
||
{
|
||
LoadHotKey(modifiers, keyCode);
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="Modifiers"></param>
|
||
/// <param name="T_Key"></param>
|
||
public HotkeyValue(int Modifiers, int T_Key)
|
||
{
|
||
this.Modifiers = ConvertModifier(Modifiers);
|
||
this.Modifiers_Int = Modifiers;
|
||
this.KeyCode = (Keys)T_Key;
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="hotkey"></param>
|
||
public HotkeyValue(string hotkey)
|
||
{
|
||
LoadHotKey(hotkey);
|
||
}
|
||
/// <summary>
|
||
/// 初始化类 <see cref="HotkeyValue"/> 的新实例。
|
||
/// </summary>
|
||
public HotkeyValue()
|
||
{
|
||
LoadHotKey(Keys.None, Keys.None);
|
||
}
|
||
/// <summary>
|
||
/// 加载热键
|
||
/// </summary>
|
||
/// <param name="modifiers"></param>
|
||
/// <param name="keyCode"></param>
|
||
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;
|
||
}
|
||
/// <summary>
|
||
/// 加载热键
|
||
/// </summary>
|
||
/// <param name="hotkey"></param>
|
||
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;
|
||
}
|
||
/// <summary>
|
||
/// 加载热键
|
||
/// </summary>
|
||
/// <param name="hotkey"></param>
|
||
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;
|
||
}
|
||
/// <summary>
|
||
/// 判断是否是热键
|
||
/// </summary>
|
||
public bool IsHotKey => KeyCode != Keys.None || (Modifiers == Keys.None && KeyCode > Keys.A && KeyCode < Keys.Z);
|
||
/// <summary>
|
||
/// 获取当前热键
|
||
/// </summary>
|
||
public string HotKey
|
||
{
|
||
get
|
||
{
|
||
if (KeyCode == Keys.None)
|
||
{ return "0"; }
|
||
return Modifiers_Int.ToString() + "+" + ((int)KeyCode).ToString();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 已重载,返回“Ctrl+Alt+A”格式的字符串。
|
||
/// </summary>
|
||
/// <returns>类似“Ctrl+Alt+A”格式的字符串</returns>
|
||
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 "无热键";
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 返回“Ctrl+Alt+A”格式的字符串。
|
||
/// </summary>
|
||
/// <returns>类似“Ctrl+Alt+A”格式的字符串</returns>
|
||
public string ToStr()
|
||
{
|
||
return ToString();
|
||
}
|
||
}
|
||
}
|