【问题标题】:Capturing Keyboard events in C# windows service在 C# windows 服务中捕获键盘事件
【发布时间】:2019-05-12 20:34:07
【问题描述】:

我在 C# 中创建了一个 Windows 服务。每当按下一个键时,我如何调用一个函数,并在这个函数中获取键的值。我需要它来上键和下键。

我的目标是在按下特定系列的键时发送电子邮件。例如,如果您按 h-e-l-l-o,无论您在哪里输入,甚至在桌面上,程序都应该发送电子邮件。

另外,我可以用另一种方式实现它。我需要一个在后台运行的程序,并在按下某个键时执行某些操作。

我怎么能做这样的事情? 举个例子会很有帮助。

【问题讨论】:

  • 由于 Windows 服务在后台运行,在非交互模式下,您希望它如何工作?显然,您想在特定时间向服务提供一些指示……但您必须想出不同的方法。
  • 你能建议我另一种解决方案吗?
  • 可能。但是你必须更多地解释情况是什么以及你想要实现什么。服务收到此输入后应该做什么?为什么你要专门通过键盘给它?通常,用户不需要以这种方式控制服务,它旨在自动运行。这是为了一些调试或手动触发特定进程,还是什么?就像我说的,如果可以解释总体目标,那么也许我们可以找到另一种方式。
  • 我想,例如,如果按下了特定系列的键,则发送一封电子邮件。例如,如果您在桌面上输入“hello”,无论您在哪里输入,程序都会发送电子邮件。
  • @ADyson 我认为 OP 不需要担心“认为是间谍软件”——听起来这正是我们的目标:)

标签: c# .net keyboard windows-services


【解决方案1】:

正如有人已经评论过的,Windows 服务没有可以接收键盘焦点或 Windows 键盘消息的前台窗口。因此,实现您所追求的唯一选择是使用low level event hook 接收键盘事件。

但是请注意,这些是系统范围的事件,您的服务可能会被它们淹没。它们在屏幕阅读器和其他辅助技术等应用程序中很有用,但我建议在使用这种方法之前尝试考虑是否有其他方法可以做你想做的事情。例如,您可以在系统托盘中运行一个应用程序并通过调用RegisterHotKey 订阅WM_HOTKEY messages 吗?

这是example of a low-level keyboard hook in C#

【讨论】:

  • 您不能使用服务中的SetWindowsHook,因为它需要服务没有的“桌面”-stackoverflow.com/questions/5815424/…。请仔细检查并编辑那个奇怪的建议。第二个建议(用户应用程序向服务发送命令)是推荐的这样做方式。
【解决方案2】:

我找到的最佳解决方案:
通常,作者在 user32.dll 程序集的低级方法上创建 .NET 包装器,这使得使用这些方法非常愉快和愉快。

    private LowLevelKeyboardListener _listener;        
    _listener = new LowLevelKeyboardListener();
    _listener.OnKeyPressed += _listener_OnKeyPressed;
    _listener.HookKeyboard();

    void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
    {
        this.textBox_DisplayKeyboardInput.Text += e.KeyPressed.ToString();
    }

here the original link

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多