CSharp - HotKey热键编写

2022年07月10日 · 笔记 · CSharp · 396次阅读

热键是什么?

热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务。笔记本电脑上最常见的热键组合即Fn键加其他键(能够与Fn进行组合使用的键多被用特殊颜色标记,并以图示或文字显示其功能在键帽上)的组合,可被用来设定系统参数,如扬声器音量。

现在很多程序都离不开快捷键,只需要按下某组合键,就能触发一些事件,如window中的复制粘贴键,只用Ctrl+C、V就可以快捷操作,不需要右键再复制粘贴。
快捷键会让程序使用更‘快捷’、‘方便’

C# HotKey类

public class Hotkey
{
    #region 系统api
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);

    [DllImport("user32.dll")]
    static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    #endregion

    /// <summary> 
    /// 注册快捷键 
    /// </summary> 
    /// <param name="hWnd">持有快捷键窗口的句柄</param> 
    /// <param name="fsModifiers">组合键</param> 
    /// <param name="vk">快捷键的虚拟键码</param> 
    /// <param name="callBack">回调函数</param> 
    public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
    {
        int id = keyid++;
        if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
            throw new Exception("regist hotkey fail.");
        keymap[id] = callBack;
    }

    /// <summary> 
    /// 注销快捷键 
    /// </summary> 
    /// <param name="hWnd">持有快捷键窗口的句柄</param> 
    /// <param name="callBack">回调函数</param> 
    public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
    {
        foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
        {
            if (var.Value == callBack)
                UnregisterHotKey(hWnd, var.Key);
        }
    }

    /// <summary> 
    /// 快捷键消息处理 
    /// </summary> 
    public static void ProcessHotKey(Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            int id = m.WParam.ToInt32();
            HotKeyCallBackHanlder callback;
            if (keymap.TryGetValue(id, out callback))
            {
                callback();
            }
        }
    }

    const int WM_HOTKEY = 0x312;
    static int keyid = 10;
    static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();

    public delegate void HotKeyCallBackHanlder();
}
public enum HotkeyModifiers
{
    MOD_ALT = 0x1,
    MOD_CONTROL = 0x2,
    MOD_SHIFT = 0x4,
    MOD_WIN = 0x8
}

百度一搜就有...

如何使用

因为CSharp没有直接的提供热键绑定等操作,所以上面类简单封装了一下Windows系统中user32库的热键api。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);

[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);

所以,注册完之后,只要保证程序正常运行,就可以全局触发热键绑定的回调函数。

使用步骤:

  1. 重构消息处理函数

    /// <summary>
    /// 重构消息处理
    /// </summary>
    /// <param name="m"></param>
    protected override void WndProc(ref Message m)
    {
     base.WndProc(ref m);
     Hotkey.ProcessHotKey(m);
    }
  2. 写一个测试回调函数

    void test(){
     MessageBox.Show("Test");
    }
  3. 调用注册热键方法

    Hotkey.Regist(this.Handle, HotkeyModifiers.MOD_ALT, Keys.X, Test);

    这里注册的热键为"Alt + X"键

  4. 注销热键方法

    Hotkey.UnRegist(this.Handle, Test);
  • 需要注意的是:此回调函数的内存地址不能改变,不能使用lamda表达式,否则不能注销热键!

标签:C#

最后编辑于:2022-07-10 23:18

评论

Lover

搜一搜

云资源站点