doupoa
一个不甘落后的热血青年!
Ping通途说

C#-注册全局热键

需要使用C# 实现在Windows中注册全局热键的功能,需要使用系统自带的两个组件,分别是“kernel32.dll”、"user32.dll"

其中,"user32.dll"用于引用热键管理功能实现本文核心功能-热键注册,"kernel32.dll"内核级组件用于捕获注册热键时的异常。

新建一个类用于封装注册功能:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class AppHotKey
{
    [DllImport("kernel32.dll")]
    public static extern uint GetLastError();
    //如果函数执行成功,返回值不为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>
    /// 注册热键
    /// </summary>
    /// <param name="hwnd">窗口句柄</param>
    /// <param name="hotKey_id">热键ID</param>
    /// <param name="keyModifiers">组合键</param>
    /// <param name="key">热键</param>
    public static void RegKey(IntPtr hwnd, int hotKey_id, KeyModifiers keyModifiers, Keys key)
    {
        try
        {
            if (!RegisterHotKey(hwnd, hotKey_id, keyModifiers, key))
            {
                if (Marshal.GetLastWin32Error() == 1409) { MessageBox.Show(key.ToString() + "热键被占用 !"); }
                else
                {
                    MessageBox.Show("注册热键失败!");
                }
            }
        }
        catch (Exception) { }
    }
    /// <summary>
    /// 注销热键
    /// </summary>
    /// <param name="hwnd">窗口句柄</param>
    /// <param name="hotKey_id">热键ID</param>
    public static void UnRegKey(IntPtr hwnd, int hotKey_id)
    {
        //注销Id号为hotKey_id的热键设定
        UnregisterHotKey(hwnd, hotKey_id);
    }

}

之后即可在主函数中重写窗口接受按键事件函数,在此之前需要定义相关常量。

下列例子中前几行需定义为函数私有变量。


private const int WM_HOTKEY = 0x312; //窗口消息:热键
private const int WM_CREATE = 0x1; //窗口消息:创建
private const int WM_DESTROY = 0x2; //窗口消息:销毁
private const int HOTKey1 = 0x1111; //热键ID ID可任意设定,但不得重复
private const int HOTKey2 = 0x2222; //热键ID

protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_HOTKEY: //窗口消息-热键ID
                    switch (m.WParam.ToInt32())
                    {
                        case HOTKey1:
                            // do something...
                            break;
                        case HOTKey2:
                            // do something...
                            break;
                        default:
                            break;
                    }
                    break;
                case WM_CREATE: //窗口消息-创建
                    AppHotKey.RegKey(Handle, HOTKey1, AppHotKey.KeyModifiers.Alt, Keys.Subtract); //此处注册热键为Alt+加号键
                    AppHotKey.RegKey(Handle, HOTKey2, AppHotKey.KeyModifiers.Alt, Keys.Add); //此次注册热键为Alt+减号键
                    break;
                case WM_DESTROY: //窗口消息-销毁
                    AppHotKey.UnRegKey(Handle, HOTKey1); //销毁热键
                    AppHotKey.UnRegKey(Handle, HOTKey2); //销毁热键
                    break;
                default:
                    break;
            }
        }
赞赏

doupoa

文章作者

诶嘿

发表回复

textsms
account_circle
email

Ping通途说

C#-注册全局热键
需要使用C# 实现在Windows中注册全局热键的功能,需要使用系统自带的两个组件,分别是“kernel32.dll”、"user32.dll" 其中,"user32.dll"用于引用热键管理功能实现本文核心功能-热键注…
扫描二维码继续阅读
2022-10-28

Optimized by WPJAM Basic