动态为程序指定快捷键
为了提供更加好的用户体验,在windows Forms开发中,通常我们需要让用户可以自定义快捷键。我们知道在设计阶段指派快捷键是很容易的,但是如何让他们可以在运行时动态指定快捷键呢?
第一步:导入两个函数,分别是注册和取消注册快捷键
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestHotKeys
{
class HotKeys
{
//如果函数执行成功,返回值不为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
}
}
}
第二步:在窗体的初始化之后,注册快捷键
/// <summary>
/// 注册快捷键。这里的100,101,102是随便写的,只要不重复就可以
/// </summary>
private void RegisterHotKeys()
{
HotKeys.RegisterHotKey(Handle, 100, HotKeys.KeyModifiers.Shift, Keys.A);
HotKeys.RegisterHotKey(Handle, 101, HotKeys.KeyModifiers.Shift, Keys.B);
HotKeys.RegisterHotKey(Handle, 102, HotKeys.KeyModifiers.Shift, Keys.C);
}
第三步:编写一个特殊事件,让窗体能接收windows消息
/// <summary>
/// 响应窗体消息的事件
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
switch (m.Msg)
{
case WM_HOTKEY: {
switch (m.WParam.ToInt32())
{
case 100: { CallMethod("A"); break; }
case 101: { CallMethod("B"); break; }
case 102: { CallMethod("C"); break; }
default:
break;
}
break;
}
default:
break;
}
base.WndProc(ref m);
}
我们这里是为了演示目的,实现了一个简单的CallMethod方法,它就是显示一个消息而已
private void CallMethod(string input) {
MessageBox.Show(input);
}
最后,不要忘记在窗体关闭的时候,取消快捷键的注册
/// <summary>
/// 取消快捷键注册
/// </summary>
private void UnRegisterHotKeys()
{
HotKeys.UnregisterHotKey(Handle, 100);
HotKeys.UnregisterHotKey(Handle, 101);
HotKeys.UnregisterHotKey(Handle, 102);
}