C# 热键
API
/// <summary> /// 注册定义系统范围的热键。失败会设置GetLastError,如果GetLastError等于ERROR_HOTKEY_ALREADY_REGISTERED,表示热键被占用, /// </summary> /// <param name="hWnd">要定义热键的窗口的句柄</param> /// <param name="id">定义热键ID,不能与其它ID重复</param> /// <param name="fsModifiers">以MOD_开头的常量,标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param> /// <param name="vk">定义的热键</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey(IntPtr hWnd,int id, int fsModifiers,int vk ); /// <summary> /// 注销以前由调用线程注册的热键。 /// </summary> /// <param name="hWnd">要取消热键的窗口的句柄</param> /// <param name="id">取消定义的热键ID</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey(IntPtr hWnd,int id);
常量
/// <summary> /// 1409-表示热键被占用 /// </summary> public const int ERROR_HOTKEY_ALREADY_REGISTERED = 0x0581; /// <summary> /// 1-按住ALT键。 /// </summary> public const int MOD_ALT = 0x0001; /// <summary> /// 2-按住CTRL键。 /// </summary> public const int MOD_CONTROL = 0x0002; /// <summary> /// 16384-更改热键行为,长按键盘时不会产生多个热键通知。 /// </summary> public const int MOD_NOREPEAT = 0x4000; /// <summary> /// 4-按住SHIFT键。 /// </summary> public const int MOD_SHIFT = 0x0004; /// <summary> /// 8-按住WINDOWS键。这些键标有Windows徽标。涉及WINDOWS键的键盘快捷方式保留供操作系统使用。 /// </summary> public const int MOD_WIN = 0x0008; /// <summary> /// 789-当用户按下由RegisterHotKey函数注册的热键时提交此消息 /// </summary> public const int WM_HOTKEY = 0x0312;
使用
/// <summary> /// ↑键ID /// </summary> private const int keyUP = 65536; /// <summary> /// →键ID /// </summary> private const int keyRight = 65537; /// <summary> /// ↓键ID /// </summary> private const int keyDown = 65538; /// <summary> /// ←键ID /// </summary> private const int keyLeft = 65539; private void Form1_Load(object sender, EventArgs e) { hookkey.RegisterHotKey(this.Handle, keyUP, Cor.Constant.MOD_CONTROL | Cor.Constant.MOD_NOREPEAT ,(int) Keys.Up); hookkey.RegisterHotKey(this.Handle, keyRight, Cor.Constant.MOD_CONTROL, (int)Keys.Right); hookkey.RegisterHotKey(this.Handle, keyDown, Cor.Constant.MOD_CONTROL, (int)Keys.Down); hookkey.RegisterHotKey(this.Handle, keyLeft, Cor.Constant.MOD_CONTROL, (int)Keys.Left); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { hookkey.UnregisterHotKey(this.Handle, keyUP); hookkey.UnregisterHotKey(this.Handle, keyRight); hookkey.UnregisterHotKey(this.Handle, keyDown); hookkey.UnregisterHotKey(this.Handle, keyLeft); } protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case Cor.Constant.WM_HOTKEY: switch (m.WParam.ToInt32()) { case keyUP: //热键ID MessageBox.Show("上"); break; case keyRight: //热键ID MessageBox.Show("右"); break; case keyDown: //热键ID MessageBox.Show("下"); break; case keyLeft: //热键ID MessageBox.Show("右"); break; default: break; } break; } }
转载请注明出处。