14

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

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

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

我四处寻找一些合适的方法来做这件事,但没有发现任何有用的东西。我所发现的只是一群人在论坛和深度键盘记录器的源代码上说“不,那是非法的”。

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

4

4 回答 4

6

您需要使用窗口挂钩:

C# 中的低级键盘挂钩

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

于 2012-04-30T12:28:06.033 回答
4

您可以使用 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);
    }

该库还可以检测特定的组合键和序列。例如:

    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"); } }
    });
于 2019-10-27T22:59:34.110 回答
2

Microsoft 告诉您如何:在表单级别处理键盘输入。只要您处理相同的事件,这适用于任何非 Web 应用程序。

您还应该查看关于 SO 的其他问题,例如处理来自键盘楔的输入

于 2012-04-30T12:21:04.977 回答
0

您可以使用 RegisterHotKey windows API 注册 Windows 热键,请查看此博客文章:

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

于 2012-04-30T12:51:17.473 回答