如何在C#代码中实现全局快捷键
C#.NET没有提供现成的API,我们通过引用系统的API进行注册
1、首先,创建一个快捷键操作的类,可以完成注册,注销的操作,具体说明看注释
public class HotKeys
{
//引入系统API
[DllImport("user32.dll")]
static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
int keyid = 10; //区分不同的快捷键
Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>(); //每一个key对于一个处理函数
public delegate void HotKeyCallBackHanlder();
//组合控制键
public enum HotkeyModifiers
{
Alt = 1,
Control = 2,
Shift = 4,
Win = 8
}
//注册快捷键
public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int id = keyid++;
if (!RegisterHotKey(hWnd, id, modifiers, vk))
throw new Exception("注册失败!");
keymap[id] = callBack;
}
// 注销快捷键
public void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
{
if (var.Value == callBack)
{
UnregisterHotKey(hWnd, var.Key);
return;
}
}
}
// 快捷键消息处理
public void ProcessHotKey(Message m)
{
if (m.Msg == 0x312)
{
int id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if (keymap.TryGetValue(id, out callback))
callback();
}
}
}
可以从代码看出,如何快捷键是如何进行注册的,需要得到窗口句柄,控制键(Ctrl,Alt,Win等),快捷键(E),回调函数,快捷键的注册是不保存的,当程序关闭后重新打开时,需要重新注册快捷键
2、接下来是使用 HotKeys 类 进行快捷键注册和注销
public partial class Form1 : Form
{
HotKeys h = new HotKeys();
public Form1()
{
InitializeComponent();
}
private void btnRegist_Click(object sender, EventArgs e)
{
//这里注册了Ctrl+Alt+E 快捷键
h.Regist(this.Handle, (int)HotKeys.HotkeyModifiers.Control + (int)HotKeys.HotkeyModifiers.Alt, Keys.E, CallBack);
MessageBox.Show("注册成功");
}
private void btnUnregist_Click(object sender, EventArgs e)
{
h.UnRegist(this.Handle, CallBack);
MessageBox.Show("卸载成功");
}
protected override void WndProc(ref Message m)
{
//窗口消息处理函数
h.ProcessHotKey(m);
base.WndProc(ref m);
}
//按下快捷键时被调用的方法
public void CallBack()
{
MessageBox.Show("快捷键被调用!");
}
}
注意,这里需要重载窗口处理函数,当快捷键信息传到到窗口时,需要对相应的信息进行处理