C# 注册快捷键
C# 注册快捷键
一、定义一个快捷键类
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 } }
二、定义记录快捷键的通用方法
本例中以C#的TextBox为记录快捷键的载体
private void txtHotKey_KeyDown(object sender, KeyEventArgs e) { int HotKeyValue = 0; string HotKeyString = ""; e.SuppressKeyPress = false; e.Handled = true; if (e.Modifiers != Keys.None) { switch (e.Modifiers) { case Keys.Control: HotKeyString += "Ctrl + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Alt: HotKeyString += "Alt + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Shift: HotKeyString += "Shift + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Control | Keys.Alt: HotKeyString += "Ctrl + Alt + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Control | Keys.Shift: HotKeyString += "Ctrl + Shift + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Alt | Keys.Shift: HotKeyString += "Alt + Shift + "; HotKeyValue = (int)e.Modifiers; break; case Keys.Control | Keys.Alt | Keys.Shift: HotKeyString += "Ctrl + Alt + Shift + "; HotKeyValue = (int)e.Modifiers; break; } if (e.KeyCode != Keys.None && e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.Menu && e.KeyCode != Keys.ShiftKey) { HotKeyString += KeyCodeToString(e.KeyCode); HotKeyValue += (int)e.KeyCode; } } else { if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back) { HotKeyString = "无"; HotKeyValue = -1; } else if (e.KeyCode != Keys.None) { HotKeyString = KeyCodeToString(e.KeyCode); HotKeyValue = (int)e.KeyCode; } } if (HotKeyValue == 0) HotKeyValue = -1; TextBox txtHotKey = (TextBox)sender; txtHotKey.Text = HotKeyString; txtHotKey.Tag = HotKeyValue; txtHotKey.SelectionStart = txtHotKey.Text.Length; } /// /// 将按键转换成相应字符 /// /// 按键 /// 字符 private string KeyCodeToString(Keys KeyCode) { if (KeyCode >= Keys.D0 && KeyCode <= Keys.D9) { return KeyCode.ToString().Remove(0, 1); } else if (KeyCode >= Keys.NumPad0 && KeyCode <= Keys.NumPad9) { return KeyCode.ToString().Replace("Pad", ""); } else { return KeyCode.ToString(); } } /// /// 设置按键不响应 /// private void txtHotKey_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; } /// /// 释放按键后,若是无实际功能键,则置无 /// private void txtHotKey_KeyUp(object sender, KeyEventArgs e) { CheckHotkey(sender); } /// /// 失去焦点后,若是无实际功能键,则置无 /// private void txtHotKey_LostFocus(object sender, EventArgs e) { CheckHotkey(sender); } /// /// 检查是否无实际功能键,是则置无 /// private void CheckHotkey(object sender) { TextBox txtHotKey = (TextBox)sender; if (txtHotKey.Text.EndsWith(" + ") || String.IsNullOrEmpty(txtHotKey.Text)) { txtHotKey.Text = "无"; txtHotKey.Tag = -1; txtHotKey.SelectionStart = txtHotKey.Text.Length; } }
三、注册快捷键
本例中使用FormActivated方法作为注册快捷键的入口
private void MainForm_Activated(object sender, EventArgs e) { //注册热键Ctrl+Shift+1,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 HotKey.RegisterHotKey(Handle, 100, (int)HotKey.KeyModifiers.Ctrl + HotKey.KeyModifiers.Shift, Keys.D1); //注册热键Ctrl+Shift+2,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 HotKey.RegisterHotKey(Handle, 101, (int)HotKey.KeyModifiers.Ctrl + HotKey.KeyModifiers.Shift, Keys.D2); //注册热键Ctrl+Shift+3,Id号为102。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 HotKey.RegisterHotKey(Handle, 102, (int)HotKey.KeyModifiers.Ctrl + HotKey.KeyModifiers.Shift, Keys.D3); //注册热键Alt+D,Id号为103。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 HotKey.RegisterHotKey(Handle, 103, HotKey.KeyModifiers.Alt, Keys.D); }
四、注销快捷键
本例中使用FormClosed方法作为注销快捷键的入口
private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { //注销Id号为100的热键设定 HotKey.UnregisterHotKey(Handle, 100); //注销Id号为101的热键设定 HotKey.UnregisterHotKey(Handle, 101);// http://ike.126.com //注销Id号为102的热键设定 HotKey.UnregisterHotKey(Handle, 102); //注销Id号为103的热键设定 HotKey.UnregisterHotKey(Handle, 103); }
五、调用快捷键
重载WndProc函数来调用快捷键
/// /// 监视Windows消息 /// 重载WndProc方法,用于实现热键响应 /// /// protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; //按快捷键 switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case 100: //按下的是Ctrl+Shift+1 //此处填写快捷键响应代码 break; case 101: //按下的是Ctrl+Shift+2 //此处填写快捷键响应代码 break; case 102: //按下的是Ctrl+Shift+3 //此处填写快捷键响应代码 break; case 103: //按下的是Alt+D //此处填写快捷键响应代码 break; } break; } base.WndProc(ref m); }
------------------------------------------------------------------------------------------------------------------------------
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Darkic
转载请注明原文链接:https://www.cnblogs.com/darkic/p/16247425.html
来源:博客园cnblogs
© 版权声明:本文为博主原创文章,转载请附上博文链接!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南