CSharp - HotKey热键编写
热键是什么?
热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务。笔记本电脑上最常见的热键组合即Fn键加其他键(能够与Fn进行组合使用的键多被用特殊颜色标记,并以图示或文字显示其功能在键帽上)的组合,可被用来设定系统参数,如扬声器音量。
现在很多程序都离不开快捷键,只需要按下某组合键,就能触发一些事件,如window中的复制粘贴键,只用Ctrl+C、V就可以快捷操作,不需要右键再复制粘贴。
快捷键会让程序使用更‘快捷’、‘方便’
C# HotKey类
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);
- 需要注意的是:此回调函数的内存地址不能改变,不能使用lamda表达式,否则不能注销热键!
评论区(暂无评论)