C#注册和注销全局快捷键

在使用酷狗听歌的时候,我们可以不打开酷狗程序,直接使用组合键(Ctrl + Alt + 上)增加音量,使用(Ctrl + Alt + 右)切换到下一曲

如何在C#代码中实现这样全局快捷键呢

C#.NET没有提供现成的API,我们通过引用系统的API进行注册

1、首先,创建一个快捷键操作的类,可以完成注册,注销的操作,具体说明看注释

复制代码
    public class HotKeys
    {
        //引入系统API
        [DllImport("user32.dll")]
        static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
        [DllImport("user32.dll")]
        static extern bool UnregisterHotKey(IntPtr hWnd, int id);


        int keyid = 10;     //区分不同的快捷键
        Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();   //每一个key对于一个处理函数
        public delegate void HotKeyCallBackHanlder();
        
        //组合控制键
        public enum HotkeyModifiers
        {
            Alt = 1,
            Control = 2,
            Shift = 4,
            Win = 8
        }
        
        //注册快捷键
        public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotKeyCallBackHanlder callBack)
        {
            int id = keyid++;
            if (!RegisterHotKey(hWnd, id, modifiers, vk))
                throw new Exception("注册失败!");
            keymap[id] = callBack;
        }
        
        // 注销快捷键
        public void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
        {
            foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
            {
                if (var.Value == callBack)
                {
                    UnregisterHotKey(hWnd, var.Key);
                    return;
                }
            }
        }
        
        // 快捷键消息处理
        public void ProcessHotKey(Message m)
        {
            if (m.Msg == 0x312)
            {
                int id = m.WParam.ToInt32();
                HotKeyCallBackHanlder callback;
                if (keymap.TryGetValue(id, out callback))
                    callback();
            }
        }
    }
复制代码

可以从代码看出,如何快捷键是如何进行注册的,需要得到窗口句柄控制键(Ctrl,Alt,Win等),快捷键(E),回调函数,快捷键的注册是不保存的,当程序关闭后重新打开时,需要重新注册快捷键

2、接下来是使用 HotKeys 类 进行快捷键注册和注销

复制代码
    public partial class Form1 : Form
    {
        HotKeys h = new HotKeys();

        public Form1()
        {
            InitializeComponent();
        }

        private void btnRegist_Click(object sender, EventArgs e)
        {
            //这里注册了Ctrl+Alt+E 快捷键
            h.Regist(this.Handle, (int)HotKeys.HotkeyModifiers.Control + (int)HotKeys.HotkeyModifiers.Alt, Keys.E, CallBack);
            MessageBox.Show("注册成功");
        }

        private void btnUnregist_Click(object sender, EventArgs e)
        {
            h.UnRegist(this.Handle, CallBack);
            MessageBox.Show("卸载成功");
        }

        protected override void WndProc(ref Message m)
        {
            //窗口消息处理函数
            h.ProcessHotKey(m);
            base.WndProc(ref m);
        }

        //按下快捷键时被调用的方法
        public void CallBack()
        {
            MessageBox.Show("快捷键被调用!");
        }
    }
复制代码

注意,这里需要重载窗口处理函数,当快捷键信息传到到窗口时,需要对相应的信息进行处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HGHdll使用说明 HGHdll.dll是胡广辉为了C#实训课程而开发的,主要有以下功能。 一、注册热键与取消热键 类HotKeys 参考代码 (1) HotKeys h = new HotKeys(); (2) //调用热键的窗体需要重写以下方法 protected override void WndProc(ref Message m) { //窗口消息处理函数 h.ProcessHotKey(m); base.WndProc(ref m); } (3) // 注册热键 可在窗体的Load事件中进行 //这里注册了Ctrl+Alt+E 快捷键,当然热键组合可以改写 h.Regist(this.Handle, (int)HotKeys.HotkeyModifiers.Control + (int)HotKeys.HotkeyModifiers.Alt, Keys.E, h.CallBack); MessageBox.Show("注册成功"); 或者代码如下,组合固定为Ctrl+Alt+E h.CAE(this); (4) // 取消热键 可在窗体的FormClosing事件中进行 h.UnRegist(this.Handle, h.CallBack); MessageBox.Show("卸载成功"); 或者代码如下 h.qx(this);//取消热键 [说明:HotKeys类h.CallBack是截屏] 二、截屏窗体 FrmCapture frmC = new FrmCapture(); frmC.Show(); 三、移动与改变控件大小的类BarcodeControl BarcodeControl barcode = new BarcodeControl(控件); 四、快捷语窗体类fw,也可用于管理“代码段” //以下是树控件双击事件中调用快捷语窗体,节点属性Text为服务类型,Name属性为数据库名称(不含拓展名) private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (fw.isthisform(e.Node.Text)) { // access数据库的连接字符串Main_Access.DataPath为数据库路径, //e.Node.Name.ToString().Trim()为数据库名称 string cons = "Provider=Microsoft.ACE.OLEDB.12.0 ; Data Source=" + Main_Access.DataPath + e.Node.Name.ToString().Trim() + @".accdb; Jet OLEDB:Database Password=iamhgh "; ( new fw(e.Node.Text, cons)).Show(); } } 注:fw窗体类使用说明 (1) ///fw对象在构造时,传递相关服务类型的数据,与连接字符串 public fw(string fwlx, string Connectionstring) {……} (2)// 判断此类型的助词窗体相同的服务类型的实例是否运行,在创建实例前时行判断,没有运行时返回true. public static bool isthisform( string lx) {……} (3)// access数据库操作类,与数据库kjfw01、kjfw02...表tc001相关, 此表有四个字段FatherNodeKey,NodeKey,NodeText,NodeLevel // 表名tc001及其字段名不变,FatherNodeKey为父节点名(存于tag),文本类型; NodeKey为本节点名,关键字,文本类型;NodeText为备注类型; // NodeLevel,为数字类型,存放节点的level 五、类safety (1) // 获取文件的md5值,即信息摘要, 返回16进制的字符串 。 public static string GetMD5HashFromFile(string fileName) {……} 调用代码举例如下: MessageBox.Show(safety.GetMD5HashFromFile(@"F:\BaiduNetdiskDownload\关于阿里巴巴.qlv")); 六、对richtextbox的十多种常用编辑,其中支持中文名称文件的超链接 (1)直接调用代码 (new richtextboxGj(null)).Show(); (2)作为fw窗体共用的富文本编辑窗体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值