112 lines
3.1 KiB
C#
112 lines
3.1 KiB
C#
|
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<KeyEventArgs>(keyFilter_KeyDown);
|
|||
|
keyFilter.KeyUp += new EventHandler<KeyEventArgs>(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
|
|||
|
}
|
|||
|
}
|