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);
}
posted @   Darkic  阅读(650)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示

目录导航