快捷键的TextBox控件
快捷键的TextBox控件
快捷键的TextBox控件
Code
//HotKey.cs
//快捷键的支持
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DesktopPaintor
{
class HotKey
{
private WinHotKey.KeyModifiers _Modifiers;
private Keys _Key;
public HotKey() { }
public HotKey(WinHotKey.KeyModifiers Modifiers, Keys Key)
{
_Modifiers = Modifiers;
_Key = Key;
}
public WinHotKey.KeyModifiers Modifiers
{
set { _Modifiers = value; } //& WinHotKey.KeyModifiers.Mask; }
get { return _Modifiers; }
}
public Keys Key
{
set { _Key = value; }
get { return _Key; }
}
public override string ToString()
{
string s = string.Empty;
if((_Modifiers & WinHotKey.KeyModifiers.Control) != WinHotKey.KeyModifiers.None)
s += "Ctrl + ";
if((_Modifiers & WinHotKey.KeyModifiers.Shift) != WinHotKey.KeyModifiers.None)
s += "Shift + ";
if((_Modifiers & WinHotKey.KeyModifiers.Alt) != WinHotKey.KeyModifiers.None)
s += "Alt + ";
if(_Key != Keys.None || _Modifiers == WinHotKey.KeyModifiers.None)
s += _Key.ToString();
return s;
}
public HotKey Clone()
{
return new HotKey(_Modifiers, _Key);
}
}
static class WinHotKey
{
[DllImport("user32.dll", SetLastError = true)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
[DllImport("user32.dll", SetLastError = true)]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
public static bool RegKey(IntPtr hWnd, int id, HotKey key)
{
return RegisterHotKey(hWnd, id, key.Modifiers, key.Key);
}
public static bool UnRegKey(IntPtr hWnd, int id)
{
return UnregisterHotKey(hWnd, id);
}
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
}
}
}
//HotKey.cs
//快捷键的支持
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DesktopPaintor
{
class HotKey
{
private WinHotKey.KeyModifiers _Modifiers;
private Keys _Key;
public HotKey() { }
public HotKey(WinHotKey.KeyModifiers Modifiers, Keys Key)
{
_Modifiers = Modifiers;
_Key = Key;
}
public WinHotKey.KeyModifiers Modifiers
{
set { _Modifiers = value; } //& WinHotKey.KeyModifiers.Mask; }
get { return _Modifiers; }
}
public Keys Key
{
set { _Key = value; }
get { return _Key; }
}
public override string ToString()
{
string s = string.Empty;
if((_Modifiers & WinHotKey.KeyModifiers.Control) != WinHotKey.KeyModifiers.None)
s += "Ctrl + ";
if((_Modifiers & WinHotKey.KeyModifiers.Shift) != WinHotKey.KeyModifiers.None)
s += "Shift + ";
if((_Modifiers & WinHotKey.KeyModifiers.Alt) != WinHotKey.KeyModifiers.None)
s += "Alt + ";
if(_Key != Keys.None || _Modifiers == WinHotKey.KeyModifiers.None)
s += _Key.ToString();
return s;
}
public HotKey Clone()
{
return new HotKey(_Modifiers, _Key);
}
}
static class WinHotKey
{
[DllImport("user32.dll", SetLastError = true)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
[DllImport("user32.dll", SetLastError = true)]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
public static bool RegKey(IntPtr hWnd, int id, HotKey key)
{
return RegisterHotKey(hWnd, id, key.Modifiers, key.Key);
}
public static bool UnRegKey(IntPtr hWnd, int id)
{
return UnregisterHotKey(hWnd, id);
}
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
}
}
}
Code
//HotKeyTextBox.cs
//快捷键HotKeyTextBox控件
using System.Windows.Forms;
namespace DesktopPaintor
{
class HotKeyTextBox : TextBox
{
private HotKey _HotKey = new HotKey();
private Keys LastKey;
public HotKeyTextBox()
{
this.KeyDown += new KeyEventHandler(HotKeyTextBox_KeyDown);
this.KeyUp += new KeyEventHandler(HotKeyTextBox_KeyUp);
this.KeyPress += new KeyPressEventHandler(HotKeyTextBox_KeyPress);
this.Text = _HotKey.ToString();
}
private void HotKeyTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
private void HotKeyTextBox_KeyUp(object sender, KeyEventArgs e)
{
if(!(e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16))
LastKey = Keys.None;
if(_HotKey.Key == Keys.None)
{
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if(e.Control)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
if(e.Shift)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
if(e.Alt)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
this.Text = _HotKey.ToString();
}
}
private void HotKeyTextBox_KeyDown(object sender, KeyEventArgs e)
{
//91,LWin; 92,RWin; 93,Apps; 46,
if(e.KeyValue == 46 || e.KeyValue == 93 || e.KeyValue == 92 || e.KeyValue == 91)
{
return;
}
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if(e.Control)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
if(e.Shift)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
if(e.Alt)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
if(e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16)
{
if(LastKey == Keys.None)
_HotKey.Key = Keys.None;
}
else
_HotKey.Key = e.KeyCode;
this.Text = _HotKey.ToString();
}
public HotKey @HotKey
{
set
{
_HotKey = value;
this.Text = value.ToString();
}
get
{
return _HotKey;
}
}
}
}
//HotKeyTextBox.cs
//快捷键HotKeyTextBox控件
using System.Windows.Forms;
namespace DesktopPaintor
{
class HotKeyTextBox : TextBox
{
private HotKey _HotKey = new HotKey();
private Keys LastKey;
public HotKeyTextBox()
{
this.KeyDown += new KeyEventHandler(HotKeyTextBox_KeyDown);
this.KeyUp += new KeyEventHandler(HotKeyTextBox_KeyUp);
this.KeyPress += new KeyPressEventHandler(HotKeyTextBox_KeyPress);
this.Text = _HotKey.ToString();
}
private void HotKeyTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
private void HotKeyTextBox_KeyUp(object sender, KeyEventArgs e)
{
if(!(e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16))
LastKey = Keys.None;
if(_HotKey.Key == Keys.None)
{
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if(e.Control)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
if(e.Shift)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
if(e.Alt)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
this.Text = _HotKey.ToString();
}
}
private void HotKeyTextBox_KeyDown(object sender, KeyEventArgs e)
{
//91,LWin; 92,RWin; 93,Apps; 46,
if(e.KeyValue == 46 || e.KeyValue == 93 || e.KeyValue == 92 || e.KeyValue == 91)
{
return;
}
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if(e.Control)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
if(e.Shift)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
if(e.Alt)
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
if(e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16)
{
if(LastKey == Keys.None)
_HotKey.Key = Keys.None;
}
else
_HotKey.Key = e.KeyCode;
this.Text = _HotKey.ToString();
}
public HotKey @HotKey
{
set
{
_HotKey = value;
this.Text = value.ToString();
}
get
{
return _HotKey;
}
}
}
}
有了上面两个文件,再在窗体上直接画上HotKeyTextBox控件就OK了。