using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using SysFuns; using ryCommon; namespace ryControls { /// /// 热键文本框 /// public partial class HotkeyTextBox : UserControl,IMessageFilter { Keys m_Modifiers =Keys.None; Keys m_Key =Keys.None; /// /// 热键文本框 /// public HotkeyTextBox() { InitializeComponent(); //定义KeyPress事件 //base.KeyPress += delegate(object sender, KeyPressEventArgs e) { e.Handled = true; }; TxtHotKey.ReadOnly = true; TxtHotKey.BackColor = Color.White; TxtHotKey.KeyDown += TxtHotKey_KeyDown; TxtHotKey.KeyUp += TxtHotKey_KeyUp; TxtHotKey.Top = (Height - TxtHotKey.Height) / 2; //Application.AddMessageFilter(this); base.BackColor = Color.White; } /// /// /// ~HotkeyTextBox() { // Application.RemoveMessageFilter(this); } /// /// /// /// /// public bool PreFilterMessage(ref Message m) { //if (m.Msg == 0x0100) //{ // var key=(Keys)(m.WParam.ToInt32()); // return false; //} return false; } /// /// 在控件大小变化时发生 /// /// protected override void OnSizeChanged(EventArgs e) { TxtHotKey.Top = (Height - TxtHotKey.Height) / 2; TxtHotKey.Width = Width - BtnClear.Width - 2; BtnClear.Top = 0; BtnClear.Left = TxtHotKey.Left + TxtHotKey.Width; BtnClear.Height = Height; } private void TxtHotKey_KeyDown(object sender, KeyEventArgs e) { OnKeyDown(e); } private void TxtHotKey_KeyUp(object sender, KeyEventArgs e) { OnKeyUp(e); } //使文本属性失效掉 /// /// 此属性无效 /// [Description("此属性无效")] public new string Text { get { return TxtHotKey.Text; } set { LoadHotKey(value); } } /// /// 载入热键配置 /// /// public void LoadHotKey(string hotkey) { T_Modifiers = 0; 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 { } UpdateText(); } private void UpdateText() { HotkeyValue xvalue = new HotkeyValue(T_Modifiers, (int)T_Key); base.Text = xvalue.ToString(); TxtHotKey.Text = base.Text; TxtHotKey.SelectionLength = 0; TxtHotKey.SelectionStart = 0; } /// /// 保存热键 /// /// public string SaveHotKey() { if(T_Key==Keys.None) { return "0+0"; } return T_Modifiers.ToString() + "+" + ((int)T_Key).ToString(); } /// /// 是否含义热键 /// public bool HaveHotKey { get { return m_Key != Keys.None || (T_Modifiers==0 && T_Key>Keys.A && T_Key /// 读取或设置热键 /// public string HotKey { get { return SaveHotKey(); } set { LoadHotKey(value); } } /// /// 功能键 /// [Description("功能键")] public int T_Modifiers { get { int i_Keys = 0; if ((m_Modifiers & Keys.Alt) != 0) { i_Keys |= 1; } if ((m_Modifiers & Keys.Control) != 0) { i_Keys |= 2; } if ((m_Modifiers & Keys.Shift) != 0 || (m_Modifiers & Keys.LShiftKey) != 0 || (m_Modifiers & Keys.RShiftKey) != 0) { i_Keys |= 4; } if ((m_Modifiers & Keys.LWin) != 0 || (m_Modifiers & Keys.RWin) != 0) { i_Keys |= 8; } return i_Keys; } set { m_Modifiers =Keys.None; if ((value & 1) != 0) { m_Modifiers |=Keys.Alt; } if ((value & 2) != 0) { m_Modifiers |= Keys.Control; } if ((value & 4) != 0) { m_Modifiers |= Keys.Shift; } if ((value & 8) != 0) { m_Modifiers |= Keys.LWin; } UpdateText(); } } /// /// 热键按键 /// [Description("热键按键")] public Keys T_Key { get { return m_Key; } set { m_Key = value; UpdateText(); } } //TextBox的KeyDown事件 /// /// KeyDown事件 /// /// protected override void OnKeyDown(KeyEventArgs e) { //if (e.Modifiers == 0) //没有修改键 //{ // e.Handled = true; // return; //} HotkeyValue value; if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Menu || e.KeyCode == Keys.None) {//除修改键外,没有按键 value = new HotkeyValue(e.Modifiers, Keys.None); } else { value = new HotkeyValue(e.Modifiers, e.KeyCode); } m_Modifiers = value.Modifiers; m_Key = value.KeyCode; base.Text = value.ToString();//赋值 TxtHotKey.Text = base.Text; e.Handled = true; base.OnKeyDown(e); } //TextBox的KeyDown事件 /// /// KeyDown事件 /// /// protected override void OnKeyUp(KeyEventArgs e) { if(m_Modifiers!=Keys.None && m_Key==Keys.None) { m_Modifiers = Keys.None; TxtHotKey.Text = "错误的热键"; } e.Handled = false; base.OnKeyUp(e); } private void BtnClear_Click(object sender, EventArgs e) { m_Modifiers =Keys.None; m_Key = Keys.None; UpdateText(); } private void CtlHotkey_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawRectangle(new Pen(Color.FromArgb(213, 216, 223)), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); } } }