首页 > 解决方案 > 在运行时使用 MouseKeyHook 取消注册热键

问题描述

我想允许用户在运行时重新分配热键并使用Gma.System.MouseKeyHookNuGet 包。

在运行时创建新的热键工作得很好而且很花哨,但是清除Action已经分配的Combination/ Sequence(通过设置它的Action = null)不会删除原始分配。

有没有办法在每个Combination/Sequence基础上做到这一点?更具体地说,我想避免调用Dispose()我的Hook.GlobalEvents()参考并不得不重新初始化整个系统分配。

任何帮助将不胜感激 :)

标签: c#wpfwinformsmousekeyhook

解决方案


如果您想退订按键事件:

_globalHook = Hook.GlobalEvents();

_globalHook.KeyPress += GlobalHookKeyPress; //Subscribe
_globalHook.KeyPress -= GlobalHookKeyPress; //Unsubscribe

编辑:

我现在明白您调用了 OnCombination。浏览此方法的代码后,您无法更改创建后的组合列表。对 OnCombination 的其他调用只会添加更多注册。

编辑:

另一种选择是使用响应式扩展

using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reactive.Linq;
using Gma.System.MouseKeyHook;
using MouseKeyHook.Rx;

namespace HotkeyPlay
{
    public partial class Form1 : Form
    {
        private IDisposable _keysObservable;

        public Form1()
        {
            InitializeComponent();

            var triggers = new Trigger[]
            {
                Trigger.On(Keys.H).Alt().Shift()
            };

            _keysObservable =
                Hook
                .GlobalEvents()
                .KeyDownObservable()
                .Matching(triggers)
                .Subscribe((trigger) =>
                 {
                     Debug.WriteLine(trigger.ToString());
                 });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _keysObservable.Dispose();

            var triggers = new Trigger[]
            {
                Trigger.On(Keys.B).Alt().Shift()
            };

            _keysObservable =
                Hook
                .GlobalEvents()
                .KeyDownObservable()
                .Matching(triggers)
                .Subscribe((trigger) =>
                {
                    Debug.WriteLine(trigger.ToString());
                });
        }
    }
}

Nuget 包:

Install-Package System.Reactive.Linq
Install-Package MouseKeyHook.Rx

MouseKeyHook.Rx 仍处于预发布版本。


推荐阅读