C#实现快捷键(系统热键)响应
(1)建立一个类文件,命名为HotKey.cs,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.InteropServices; 6 using System.Windows.Forms; 7 8 namespace TalentPlayer 9 { 10 class HotKey 11 { 12 //如果函数执行成功,返回值不为0。 13 //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。 14 [DllImport("user32.dll", SetLastError = true)] 15 public static extern bool RegisterHotKey( 16 IntPtr hWnd, //要定义热键的窗口的句柄 17 int id, //定义热键ID(不能与其它ID重复) 18 KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 19 Keys vk //定义热键的内容 20 ); 21 22 [DllImport("user32.dll", SetLastError = true)] 23 public static extern bool UnregisterHotKey( 24 IntPtr hWnd, //要取消热键的窗口的句柄 25 int id //要取消热键的ID 26 ); 27 28 //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) 29 [Flags()] 30 public enum KeyModifiers 31 { 32 None = 0, 33 Alt = 1, 34 Ctrl = 2, 35 Shift = 4, 36 WindowsKey = 8 37 } 38 } 39 }
简单说明一下:
“
public
static
extern
bool
RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且
user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上
“[DllImport(
"user32.dll"
, SetLastError =
true
)]”这行语句。
“
public
static
extern
bool
UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。
“
public
enum
KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅
助键的代码而只需直接选择其名称即可。
(2)以窗体Form2为例,介绍HotKey类的使用
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace TalentPlayer 11 { 12 public partial class Form2 : Form 13 { 14 public Form2() 15 { 16 InitializeComponent(); 17 } 18 //在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置 19 private void Form2_Activated(object sender, EventArgs e) 20 { 21 //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 22 HotKey.RegisterHotKey(Handle, 100, 0, Keys.Left); 23 //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 24 HotKey.RegisterHotKey(Handle, 101, 0, Keys.Right); 25 //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 26 HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D); 27 } 28 //在FormA的Leave事件中注销热键。 29 private void Form2_Leave(object sender, EventArgs e) 30 { 31 //注销Id号为100的热键设定 32 HotKey.UnregisterHotKey(Handle, 100); 33 //注销Id号为101的热键设定 34 HotKey.UnregisterHotKey(Handle, 101); 35 //注销Id号为102的热键设定 36 HotKey.UnregisterHotKey(Handle, 102); 37 } 38 ///重载FromA中的WndProc函数 39 /// 40 /// 监视Windows消息 41 /// 重载WndProc方法,用于实现热键响应 42 /// 43 /// 44 protected override void WndProc(ref Message m) 45 { 46 const int WM_HOTKEY = 0x0312; 47 //按快捷键 48 switch (m.Msg) 49 { 50 case WM_HOTKEY: 51 switch (m.WParam.ToInt32()) 52 { 53 case 100: //按下的是Shift+S 54 MessageBox.Show("1"); 55 break; 56 case 101: //按下的是Ctrl+B 57 //此处填写快捷键响应代码 58 MessageBox.Show("2"); 59 break; 60 case 102: //按下的是Alt+D 61 //此处填写快捷键响应代码 62 break; 63 } 64 break; 65 } 66 base.WndProc(ref m); 67 } 68 } 69 }