热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务。笔记本电脑上最常见的热键组合即Fn键加其他键(能够与Fn进行组合使用的键多被用特殊颜色标记,并以图示或文字显示其功能在键帽上)的组合,可被用来设定系统参数,如扬声器音量。
现在很多程序都离不开快捷键,只需要按下某组合键,就能触发一些事件,如window中的复制粘贴键,只用Ctrl+C、V就可以快捷操作,不需要右键再复制粘贴。
快捷键会让程序使用更‘快捷’、‘方便’
public class Hotkey
{
#region 系统api
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
#endregion
/// <summary>
/// 注册快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="fsModifiers">组合键</param>
/// <param name="vk">快捷键的虚拟键码</param>
/// <param name="callBack">回调函数</param>
public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int id = keyid++;
if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
throw new Exception("regist hotkey fail.");
keymap[id] = callBack;
}
/// <summary>
/// 注销快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="callBack">回调函数</param>
public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
{
if (var.Value == callBack)
UnregisterHotKey(hWnd, var.Key);
}
}
/// <summary>
/// 快捷键消息处理
/// </summary>
public static void ProcessHotKey(Message m)
{
if (m.Msg == WM_HOTKEY)
{
int id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if (keymap.TryGetValue(id, out callback))
{
callback();
}
}
}
const int WM_HOTKEY = 0x312;
static int keyid = 10;
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
public delegate void HotKeyCallBackHanlder();
}
public enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
百度一搜就有...
因为CSharp没有直接的提供热键绑定等操作,所以上面类简单封装了一下Windows系统中user32库的热键api。
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
所以,注册完之后,只要保证程序正常运行,就可以全局触发热键绑定的回调函数。
使用步骤:
重构消息处理函数
/// <summary>
/// 重构消息处理
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
Hotkey.ProcessHotKey(m);
}
写一个测试回调函数
void test(){
MessageBox.Show("Test");
}
调用注册热键方法
Hotkey.Regist(this.Handle, HotkeyModifiers.MOD_ALT, Keys.X, Test);
这里注册的热键为"Alt + X"键
注销热键方法
Hotkey.UnRegist(this.Handle, Test);