C#注册和卸载系统全局快捷键(热键)
首先要用到一个类文件,我们新建一个类,代码如下
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; namespace 注册系统热键 { class HotKey { //如果函数执行成功,返回值不为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 ); //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) [Flags()] public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 } } }
然后到窗体上放两个button,分别是注册系统热键和卸载系统热键,再放一个textbox.窗体代码如下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace 注册系统热键 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 //HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S); ////注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 //HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B); ////注册热键Ctrl+Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 //HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt | HotKey.KeyModifiers.Ctrl, Keys.D); ////注册热键F5,Id号为103。 //HotKey.RegisterHotKey(Handle, 103, HotKey.KeyModifiers.None, Keys.F5); } protected override void WndProc(ref Message m)//消息处理 { const int WM_HOTKEY = 0x0312; //按快捷键 switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case 100: //按下的是Shift+S textBox1.Text = "按下的是Shift+S"; break; case 101: //按下的是Ctrl+B //此处填写快捷键响应代码 textBox1.Text = "按下的是Ctrl+B"; break; case 102: //按下的是Alt+D //此处填写快捷键响应代码 textBox1.Text = "按下的是Ctrl+Alt+D"; break; case 103: textBox1.Text = "按下的是F5"; break; } break; } base.WndProc(ref m); } private void button2_Click(object sender, EventArgs e)//注册热键 { //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 if (HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S)) { Text = "注册热键[Shift+S]成功"; } else { Text = "注册热键[Shift+S]失败"; } } private void button1_Click(object sender, EventArgs e)//卸载热键 { if (HotKey.UnregisterHotKey(Handle, 100)) { Text = "卸载热键[Shift+S]成功"; } else { Text = "卸载热键[Shift+S]失败"; } } } }
看看运行效果吧。在记事本内输入内容,然后按下shift+s这时窗体有了反应。
再次运行程序,点击注册,这个时候显示注册失败。因为shift+s已经被之前运行的程序占用了。但是我们可以到注册失败的窗体中卸载热键。
完整的源码下载(VS2010+.net2.0)