【问题标题】:KeyPress event not firing when using MouseKeyHook使用 MouseKeyHook 时未触发 KeyPress 事件
【发布时间】:2017-03-21 08:29:33
【问题描述】:

几天前我开始使用 MouseKeyHook 库来拦截我们正在构建的应用程序的键盘按钮(应用程序使用数字键盘作为输入以通过 Akka 发送特定消息等)。

我已经设法使用控制台应用程序让它很快工作并在那里注册所有内容,但是一旦我将实现移动到特定服务中,它就停止工作(没有触发事件)。

代码示例如下:

public class KeypadService : IKeypad
{
    private readonly IKeyboardEvents _keyboardEvents;

    public KeypadService()
    {
        _keyboardEvents = Hook.GlobalEvents();
        _keyboardEvents.KeyPress += GlobalHookKeyPress;
    }

    public void Enable(Action<string> codeEntered)
    {

    }

    public void Disable()
    {
        _keyboardEvents.KeyPress -= GlobalHookKeyPress;
    }

    private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
    {
        // Do something
    }
}

KeypadService 由 Autofac 在应用程序启动时创建(并且启动应用程序是一个控制台应用程序)。

builder.RegisterType<KeypadService>().As<IKeypad>().SingleInstance();

构造函数被命中,一切都在构造函数内部执行。

关于为什么它可能不会发射的任何线索?任何帮助表示赞赏!

【问题讨论】:

  • 您是否尝试从 Windows 服务挂钩键盘?对吗?

标签: c# mousekeyhook


【解决方案1】:

我的假设是您正在尝试从 Windows 服务中连接键盘。如果是这样就有问题。

简要说明: Windows 挂钩需要有一个所谓的“交互式会话”才能正常工作。每当用户登录时,就会创建一个交互式会话。由于可以有多个用户登录到一台 Windows 机器,因此有时会有多个交互式会话,有时没有。服务独立于交互式会话运行,甚至在没有人登录的情况下运行。

详细解释见本帖:Global Keyboard Hook from windows service 窗口服务

【讨论】:

  • 不完全是,但我明白你在说什么。我实际上是通过控制台应用程序(在后台作为 Windows 应用程序运行)运行它,它执行通常的启动工作,例如注册依赖项、启动我的演员系统等。我的第一种方法是让 Autofac 创建KeypadService 的一个实例,但是没有用,然后我通过在控制台应用程序中手动创建一个实例并将该实例传递给依赖解析器,以便它可以做自己的事情,但这不是我的事情想继续做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多