RaUI/Source/MyDb/SysFuns/HotkeyValue.cs
2020-11-28 15:03:57 +08:00

309 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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