动态为程序指定快捷键

为了提供更加好的用户体验,在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);
}

posted @ 2008-08-15 21:14  陈希章  阅读(572)  评论(0编辑  收藏  举报