您的位置:首页 > 编程语言 > C#

【笔记】C#注册和注销全局快捷键

2012-12-09 14:17 330 查看
在使用酷狗听歌的时候,我们可以不打开酷狗程序,直接使用组合键(Ctrl + Alt + 上)增加音量,使用(Ctrl + Alt + 右)切换到下一曲

如何在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("快捷键被调用!");
}
}


注意,这里需要重载窗口处理函数,当快捷键信息传到到窗口时,需要对相应的信息进行处理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: