c# - 在运行时使用 MouseKeyHook 取消注册热键
问题描述
我想允许用户在运行时重新分配热键并使用Gma.System.MouseKeyHook
NuGet 包。
在运行时创建新的热键工作得很好而且很花哨,但是清除Action
已经分配的Combination
/ Sequence
(通过设置它的Action = null
)不会删除原始分配。
有没有办法在每个Combination
/Sequence
基础上做到这一点?更具体地说,我想避免调用Dispose()
我的Hook.GlobalEvents()
参考并不得不重新初始化整个系统分配。
任何帮助将不胜感激 :)
解决方案
如果您想退订按键事件:
_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 仍处于预发布版本。
推荐阅读
- xcode - SwiftCharts 和 MacBook M1
- asp.net-mvc - IIS URL 重写规则无法匹配短路径
- quarkus - 我们如何组织不同的配置文件以在 application.properties 中使用 Quarkus 配置文件
- security - 包含敏感数据的 Elasticsearch 配置文件
- python - 如何将多列与给定的单列匹配并在新列中获取其名称?
- python - 使用列作为边界熊猫数据框创建行谱
- css - 无法使用 Bootstrap 4.5.0 设置 $form-feedback-invalid-color
- c - 如何正确替换c中的函数
- python - Python Flask API : The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again
- mongodb - 使用聚合的对象列表到嵌套对象