【问题标题】:Monitoring keyboard activity in C# while my application is in the background在我的应用程序在后台时监视 C# 中的键盘活动
【发布时间】:2012-05-10 03:30:10
【问题描述】:

首先,我需要明确表示我对键盘记录没有兴趣。

当我的应用程序在后台运行时,我需要一种方法来监控最基本的键盘活动。 我不需要知道哪些键,我不需要保存任何数据,我根本不需要或不打算隐藏我的应用程序,我只需要知道何时按下键并调用方法。

我正在寻找最简单的方法来做到这一点,我知道一定数量的 C#,但没有什么太复杂的,因为我的大部分知识都是自学的。

我环顾四周寻找一些合适的方法,但没有发现任何有用的方法。我只发现一堆人在论坛和深度键盘记录器的源代码上说“不,那是非法的”。

如果你们中的任何人能就实现这一目标的方法向我提出建议,那么我将不胜感激。

【问题讨论】:

    标签: c# .net windows keyboard keyboard-hook


    【解决方案1】:

    您需要使用窗口挂钩:

    Low-Level Keyboard Hook in C#

    但请注意,Windows 安全性可能会保护我们免于为所欲为!

    【讨论】:

      【解决方案2】:

      您可以使用 Nuget 包MouseKeyHook (GitHub) 在后台监控键盘和鼠标活动。

      此代码检测何时按下键:

          private IKeyboardMouseEvents _globalHook;
      
          private void Subscribe()
          {
              if (_globalHook == null)
              {
                  // Note: for the application hook, use the Hook.AppEvents() instead
                  _globalHook = Hook.GlobalEvents();
                  _globalHook.KeyPress += GlobalHookKeyPress;
              }
          }
      
          private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
          {
              Console.WriteLine("KeyPress: \t{0}", e.KeyChar);
          }
      
          private void Unsubscribe()
          {
              if (_globalHook != null)
              {
                  _globalHook.KeyPress -= GlobalHookKeyPress;
                  _globalHook.Dispose();
              }
          }
      

      您需要致电Subscribe() 开始收听,并致电Unsubscribe() 停止收听。显然你需要修改GlobalHookKeyPress() 来做有用的工作。

      我需要这个功能来编写一个实用程序,该实用程序将在按下任何键时打开联想 Thinkpad 上的键盘背光,包括 CTRL(KeyPress 没有捕捉到)。为此,我不得不监视按键按下。除了我们附加到不同的事件之外,代码是相同的......

          _globalHook.KeyDown += GlobalHookOnKeyDown;
      

      和事件处理程序签名不同:

          private static void GlobalHookOnKeyDown(object sender, KeyEventArgs e)
          {
              Console.WriteLine("KeyDown: \t{0}", e.KeyCode);
          }
      

      图书馆也可以detect specific key combinations and sequences。例如:

          Hook.GlobalEvents().OnCombination(new Dictionary<Combination, Action>
          {
              { Combination.TriggeredBy(Keys.A).Control(), () => { Console.WriteLine("You Pressed CTRL+A"); } },
              { Combination.FromString("Shift+Alt+Enter"), () => { Console.WriteLine("You Pressed FULL SCREEN"); } }
          });
      

      【讨论】:

      • 像老板一样工作!
      【解决方案3】:

      微软告诉你How to: Handle Keyboard Input at the Form Level。只要您处理相同的事件,这适用于任何非 Web 应用程序。

      您还应该看看这里关于 SO 的其他问题,例如 Handling Input from a Keyboard Wedge

      【讨论】:

      • 那是应用程序在前台时的情况,不是吗?
      • 是的,我需要在后台监控它。
      【解决方案4】:

      您可以使用 RegisterHotKey windows API 注册 Windows 热键,请看这篇博文:

      http://www.liensberger.it/web/blog/?p=207

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 2015-12-12
        • 1970-01-01
        相关资源
        最近更新 更多