/// <summary> /// 热键 /// </summary> public class HotKey { public const int WM_HOTKEY = 0x0312; //如果函数执行成功,返回值不为0。 //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。 [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey( IntPtr hWnd, //要定义热键的窗口的句柄 int id, //定义热键ID(不能与其它ID重复) KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 Keys vk //定义热键的内容 ); [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey( IntPtr hWnd, //要取消热键的窗口的句柄 int id //要取消热键的ID ); //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) /// <summary> /// 计算标识 /// </summary> /// <param name="keyModifiers"></param> /// <param name="key"></param> /// <returns></returns> internal static int CalculateID(KeyModifiers keyModifiers, Keys key) { return (int)keyModifiers + ((int)key << 4); } public readonly KeyModifiers ModifierKey; public readonly Keys Key; public readonly int id; /// <summary> /// /// </summary> /// <param name="keyModifiers"></param> /// <param name="key"></param> internal HotKey(KeyModifiers keyModifiers, Keys key) { this.ModifierKey = keyModifiers; this.Key = key; this.id = HotKey.CalculateID(keyModifiers, key); } }
/// <summary> /// 热键事件参数 /// </summary> public class HotKeyEventArgs : EventArgs { public readonly HotKey hotKey; public readonly DateTime dateTime; public HotKeyEventArgs(HotKey hotKey, DateTime time) { this.hotKey = hotKey; this.dateTime = time; } }
/// <summary> /// 热键委托 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void HotKeyEventHandler(object sender, HotKeyEventArgs e);
[Flags] public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 }
窗体基类
public partial class UBaseForm : Form { public UBaseForm() { InitializeComponent(); } protected Dictionary<int, HotKey> HotKeys; public void RegisterHotKey(KeyModifiers keyModifiers, Keys keys) { if (HotKeys == null) HotKeys = new Dictionary<int, HotKey>(); int id = HotKey.CalculateID(keyModifiers, keys); if (!HotKeys.ContainsKey(id)) { HotKey newHotkey = new HotKey(keyModifiers, keys); HotKeys.Add(id, newHotkey); HotKey.RegisterHotKey(Handle, id, newHotkey.ModifierKey, newHotkey.Key); } } public void UnRegisterHotKey(KeyModifiers keyModifiers, Keys keys) { if (HotKeys == null) return; int id = HotKey.CalculateID(keyModifiers, keys); if (HotKeys.ContainsKey(id)) { HotKeys.Remove(id); HotKey.UnregisterHotKey(Handle, id); } } /// <summary> /// 在热键按下时发生 /// </summary> [Description("在热键按下时发生")] public event HotKeyEventHandler HotKeyEventHandler; /// /// 监视Windows消息 /// 重载WndProc方法,用于实现热键响应 /// /// protected override void WndProc(ref Message m) { if(m.Msg == HotKey.WM_HOTKEY) { int hotKeyId = (int)(m.WParam); if (HotKeys != null && HotKeys.ContainsKey(hotKeyId)) { HotKeyEventHandler?.Invoke(this, new HotKeyEventArgs(HotKeys[hotKeyId], DateTime.Now)); } } base.WndProc(ref m); } }
使用方式
public partial class MainForm : UBaseForm { public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { RegisterHotKey(KeyModifiers.Ctrl, Keys.T); RegisterHotKey(KeyModifiers.Ctrl, Keys.W); } private void MainForm_HotKeyEventHandler(object sender, HotKeyEventArgs e) { if (e.hotKey.ModifierKey == KeyModifiers.Ctrl && e.hotKey.Key == Keys.T) { //执行方法 } if (e.hotKey.ModifierKey == KeyModifiers.Ctrl && e.hotKey.Key == Keys.W) { //执行方法 } } }