using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Windows.Forms; namespace TibisMathematicsSuite.KeyboardIO { public class KeyShortcutBox : TextBox { #region Variables private KeyMessageFilter keyFilter = new KeyMessageFilter(); private MyKey currentKey = new MyKey(); private bool inputFinished = false; #endregion #region Properties public MyKey Key { get { return MyKey.Parse(this.Text); } } #endregion #region Constructor public KeyShortcutBox() : base() { this.ReadOnly = true; this.BackColor = SystemColors.Window; Application.AddMessageFilter(keyFilter); keyFilter.KeyDown += new EventHandler(keyFilter_KeyDown); keyFilter.KeyUp += new EventHandler(keyFilter_KeyUp); } #endregion #region Key updating private void keyFilter_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.LMenu: case Keys.RMenu: case Keys.Menu: currentKey.Mods &= ~MyKey.Modifiers.Alt; break; case Keys.LShiftKey: case Keys.RShiftKey: case Keys.ShiftKey: currentKey.Mods &= ~MyKey.Modifiers.Shift; break; case Keys.LControlKey: case Keys.RControlKey: case Keys.ControlKey: currentKey.Mods &= ~MyKey.Modifiers.Ctrl; break; case Keys.LWin: case Keys.RWin: currentKey.Mods &= ~MyKey.Modifiers.Win; break; default: inputFinished = true; currentKey.Key = Keys.None; break; } updateKey(); } private void keyFilter_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.LMenu: case Keys.RMenu: case Keys.Menu: currentKey.Mods |= MyKey.Modifiers.Alt; break; case Keys.LShiftKey: case Keys.RShiftKey: case Keys.ShiftKey: currentKey.Mods |= MyKey.Modifiers.Shift; break; case Keys.LControlKey: case Keys.RControlKey: case Keys.ControlKey: currentKey.Mods |= MyKey.Modifiers.Ctrl; break; case Keys.LWin: case Keys.RWin: currentKey.Mods |= MyKey.Modifiers.Win; break; default: currentKey.Key = e.KeyCode; break; } inputFinished = false; updateKey(); } private void updateKey() { if (!inputFinished && this.Focused && this.Enabled) this.Text = currentKey.ToString(); } #endregion #region Reset public void Reset() { this.Text = ""; this.inputFinished = false; } #endregion } }